假设我在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,或者说它是?
发布于 2011-10-25 17:34:54
a.b返回多个输出,因此您不能期望对其调用函数。我能想到的不使用arrayfun的最好的一行程序是:
y = subsref([a.b], substruct('.', c));请注意,a.b.c实际上与以下内容相同:
y = subsref(a.b, substruct('.', c))这就是为什么它不适用于非标量a的原因。
发布于 2011-10-25 00:27:54
在Matlab语言中,您对arrayfun的调用对我来说已经足够惯用了。我不认为这是矢量化的,但它得到了很好的优化,而且可能是最快的方法。您还应该尝试使用循环进行基准测试,看看JIT编译器在这里是否执行得很好。没有测试就很难知道。
发布于 2011-10-27 12:37:27
你可以用两行代码来完成:
>> s = [a.b];
>> y = [s.c]
y =
4 5 7另一个可能的一行(可读性较差!):
>> y = squeeze(cell2mat( struct2cell([a.b]) ))
y =
4
5
7https://stackoverflow.com/questions/7878534
复制相似问题