【问题标题】:Vectorization of multi-level indexing of structs in MATLABMATLAB中结构多级索引的向量化
【发布时间】:2011-12-14 06:42:11
【问题描述】:

假设我在 MATLAB 中有以下内容:

a(1).b.c = 4;
a(2).b.c = 5;
a(3).b.c = 7;
....

我想将值 [4 5 7 ...] 收集到一个数组中,不循环并以矢量化方式。

我试过了:

>> a(:).b.c 
# Error: Scalar index required for this type of multi-level indexing.

>> a.b.c
# Error: Dot name reference on non-scalar structure.

但他们没有工作。我能想到的最好的方法是:

arrayfun(@(x) x.b.c, a);

但据我了解arrayfunnot vectorized,还是这样?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    在 Matlab 中,您对 arrayfun 的调用对我来说似乎是惯用的。我不认为这是矢量化的,但它经过了很好的优化,也许是最快的方式。 您还应该尝试使用循环进行基准测试,以查看 JIT 编译器在此处是否表现良好。没有测试很难知道。

    【讨论】:

      【解决方案2】:

      你可以用两行来完成:

      >> s = [a.b];
      >> y = [s.c]
      y =
           4     5     7
      

      另一种可能的单行(可读性较差!):

      >> y = squeeze(cell2mat( struct2cell([a.b]) ))
      y =
           4
           5
           7
      

      【讨论】:

        【解决方案3】:

        a.b 返回多个输出,因此您不能期望在其上调用函数。在不使用arrayfun 的情况下,我能想到的最好的单线是:

        y = subsref([a.b], substruct('.', c));
        

        请注意,a.b.c 实际上与以下内容相同:

        y = subsref(a.b, substruct('.', c))
        

        这就是为什么它不适用于非标量 a

        【讨论】:

          猜你喜欢
          • 2012-04-03
          • 2015-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-02
          • 1970-01-01
          • 2021-07-19
          相关资源
          最近更新 更多