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中结构多级索引的向量化的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中向量数组的向量范数

深度学习词的向量化表示

在MATLAB中查找子集的索引

学习向量量化在matlab中效果不佳

我们是不是需要 C++ 中的向量化或 for 循环已经足够快?

[人工智能-深度学习-56]:循环神经网络 - 词向量的自动构建与模型训练