2011-10-24 137 views
11

结构的多层次索引说在MATLAB我有以下:矢量在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,是这样吗?

回答

1

a.b返回多个输出,所以你不能指望调用它的功能。最好的一个班轮我能想到的,而无需使用arrayfun是:

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

注意a.b.c实际上是相同的:

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

这就是为什么它不应该对非标a工作。

2

您呼叫arrayfun似乎对Matlab来说足够惯用。我不认为这是矢量化的,但它是优化的,也许是最快的方法。 您还应该尝试使用循环进行基准测试,以查看JIT编译器在此处的性能是否良好。没有测试就很难知道。

+0

'arrayfun'看起来好像没什么问题。 – Nzbuu

2

你可以做到这一点在两行:

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

另一种可能的一行(不易阅读!):

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