在MATLAB中:如何将结构的嵌套字段转换为单元数组?

时间:2016-05-14 21:51:49

标签: 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单元格数组:

n = length(s);
c = cell(1,n);
for k = 1:n
    c{k} = s(k).f1.fa;
end

如果我想类似地为非嵌套字段做,例如f2,那么我可以“向量化”操作(参见this question),只写:

c = {s.f2};

然而,相同的方法似乎不适用于嵌套字段。那么什么是可能的方法来矢量化上面的for-loop?

1 个答案:

答案 0 :(得分:2)

你无法真正对其进行矢量化。问题是Matlab不允许大多数形式的嵌套索引,包括[].

最简洁/可读的选项是使用s.f1在结构数组中连接[...]结果,然后使用单独的调用索引到新结构数组中:

x = [s.f1]; c = {x.fa};

如果你有一个Mapping Toolbox,你可以使用extractfield在一个表达式中执行第二个索引:

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和类似函数通常比显式for循环慢。因此,如果性能至关重要,请在决定摆脱循环之前对代码进行时间/分析。