【问题标题】:In MATLAB: How should nested fields of a struct be converted to a cell array?在 MATLAB 中:如何将结构的嵌套字段转换为元胞数组?
【发布时间】:2016-09-10 23:09:30
【问题描述】:

在 MATLAB 中,我想为 1 x n 结构(非标量结构)的每个索引提取一个嵌套字段,并将输出作为 1 x n 元胞数组接收。举个简单的例子,假设我从以下 struct s 开始:

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,那么我可以“矢量化”该操作(请参阅 this question),只需编写:

c = {s.f2};

但是,相同的方法似乎不适用于嵌套字段。那么有哪些可能的方法来向量化上述 for 循环呢?

【问题讨论】:

    标签: arrays matlab struct


    【解决方案1】:

    你不能真正矢量化它。问题是Matlab 不允许大多数形式的嵌套索引,包括[].

    最简洁/易读的选项是使用[...]s.f1 结果连接成一个结构数组,然后通过单独的调用索引到新的结构数组:

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

    如果您有一个映射工具箱,您可以使用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 循环慢。因此,如果性能至关重要,请在决定摆脱循环之前对代码进行时间/分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多