首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中结构多级索引的矢量化

MATLAB中结构多级索引的矢量化
EN

Stack Overflow用户
提问于 2011-10-25 00:05:51
回答 3查看 5.7K关注 0票数 11

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

代码语言:javascript
复制
a(1).b.c = 4;
a(2).b.c = 5;
a(3).b.c = 7;
....

我想收集单个数组中的值[4 5 7 ...],没有循环,而且是以向量化的方式。

我试过了:

代码语言:javascript
复制
>> a(:).b.c 
# Error: Scalar index required for this type of multi-level indexing.

代码语言:javascript
复制
>> a.b.c
# Error: Dot name reference on non-scalar structure.

但它们不起作用。我能想到的最好的结果是:

代码语言:javascript
复制
arrayfun(@(x) x.b.c, a);

但据我所知,arrayfun就是not vectorized,或者说它是?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-25 17:34:54

a.b返回多个输出,因此您不能期望对其调用函数。我能想到的不使用arrayfun的最好的一行程序是:

代码语言:javascript
复制
y = subsref([a.b], substruct('.', c));

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

代码语言:javascript
复制
y = subsref(a.b, substruct('.', c))

这就是为什么它不适用于非标量a的原因。

票数 1
EN

Stack Overflow用户

发布于 2011-10-25 00:27:54

在Matlab语言中,您对arrayfun的调用对我来说已经足够惯用了。我不认为这是矢量化的,但它得到了很好的优化,而且可能是最快的方法。您还应该尝试使用循环进行基准测试,看看JIT编译器在这里是否执行得很好。没有测试就很难知道。

票数 2
EN

Stack Overflow用户

发布于 2011-10-27 12:37:27

你可以用两行代码来完成:

代码语言:javascript
复制
>> s = [a.b];
>> y = [s.c]
y =
     4     5     7

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

代码语言:javascript
复制
>> y = squeeze(cell2mat( struct2cell([a.b]) ))
y =
     4
     5
     7
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7878534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档