Arrays 在MATLAB中:如何将结构的嵌套字段转换为单元数组?
在MATLAB中,我想为1 x n结构(非标度结构)的每个索引提取一个嵌套字段,并作为1 x n单元数组接收输出。作为一个简单的示例,假设我从以下结构开始:Arrays 在MATLAB中:如何将结构的嵌套字段转换为单元数组?,arrays,matlab,struct,Arrays,Matlab,Struct,在MATLAB中,我想为1 x n结构(非标度结构)的每个索引提取一个嵌套字段,并作为1 x n单元数组接收输出。作为一个简单的示例,假设我从以下结构开始: s(1).f1.fa = 'foo'; s(2).f1.fa = 'yedd'; s(1).f1.fb = 'raf'; s(2).f1.fb = 'da'; s(1).f2 = 'bok'; s(2).f2 = 'kemb'; 我可以使用for循环生成所需的1 x 2单元阵列c: n = length(s); c = cell(1,n)
s(1).f1.fa = 'foo';
s(2).f1.fa = 'yedd';
s(1).f1.fb = 'raf';
s(2).f1.fb = 'da';
s(1).f2 = 'bok';
s(2).f2 = 'kemb';
我可以使用for循环生成所需的1 x 2单元阵列c:
n = length(s);
c = cell(1,n);
for k = 1:n
c{k} = s(k).f1.fa;
end
如果我想对非嵌套字段(例如f2)执行类似操作,那么我可以“矢量化”操作(请参阅),只需编写:
c = {s.f2};
但是,相同的方法似乎不适用于嵌套字段。那么,对上述for循环进行矢量化的可能方法是什么呢?您无法真正对其进行矢量化。问题是Matlab不允许大多数形式的嵌套索引,包括
[]。
最简洁/可读的选项是使用[…]
将s.f1
结果连接到结构数组中,然后使用单独的调用索引到新的结构数组中:
x = [s.f1]; c = {x.fa};
如果您有映射工具箱,则可以使用在一个表达式中执行第二个索引:
c = extractfield([s.f1], 'fa');
或者,您可以使用arrayfun
编写一个单行程序-这里有几个选项:
c = arrayfun(@(x) x.f1.fa, s, 'uni', false);
c = arrayfun(@(x) x.fa, [s.f1], 'uni', false);
请注意,对于循环,arrayfun
和类似函数通常比显式慢。因此,如果性能非常关键,那么在决定摆脱循环之前,先对代码进行时间/概要分析