MATLAB中结构多级索引的向量化
Posted
技术标签:
【中文标题】MATLAB中结构多级索引的向量化【英文标题】:Vectorization of multi-level indexing of structs in MATLAB 【发布时间】: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);
但据我了解arrayfun
是not vectorized,还是这样?
【问题讨论】:
【参考方案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
。
【讨论】:
以上是关于MATLAB中结构多级索引的向量化的主要内容,如果未能解决你的问题,请参考以下文章