在Matlab中,获取结构中的字段值

时间:2013-06-20 09:14:19

标签: matlab struct field

对不起,如果之前已经问过这个问题,找不到搜索。 我有一组结构(约1000)。每个结构都有一个名为“travelTime”的字段,它是一个大小为“120x92x150”的3D矩阵。我需要查找所有1000个矩阵的某个位置的值,例如。 index(60,46,75)所以我有一个包含1000个元素的数组。我可以在for循环中完成它,但是有更简单,更优雅的方式(更快)吗?

谢谢, 卡姆兰

2 个答案:

答案 0 :(得分:4)

沿第四维连接所有内容,检索所有索引,然后squeeze将结果返回到列向量中。例如,如果结构数组是S,则可以执行以下操作:

A = cat(4, S.travelTime);
points = squeeze(A(60, 46, 75, :));

基准

让我们对可能的解决方案进行基准测试:

M = reshape(1:18, 2, 3, 3);
for k = 1:100
    s(k).travelTime = mod(k, 6) * M;
end

tries = 1e4;

%// Vectorized solution
tic
for jj = 1:tries
    A = cat(4, s.travelTime);
    points = squeeze(A(1, 2, 1, :));
end
toc

%// For loop solution
tic
for jj = 1:tries
    points = zeros(size(s));
    for ii = 1:numel(s)
        points(ii) = s(ii).travelTime(1, 2, 1);
    end
end
toc

%// arrayfun solution
tic
for jj = 1:tries
    Points = arrayfun(@(ii)s(ii).travelTime(1, 2, 1), 1:numel(s));
end
toc

结果是:

Elapsed time is 0.072367 seconds.
Elapsed time is 0.890323 seconds.
Elapsed time is 1.08522 seconds.

毫不奇怪,矢量化解决方案是最快的,而arrayfun解决方案是最慢的。

答案 1 :(得分:2)

In Matlab, how can I sort the order of a nested structure?复制一个很好的答案(感谢@ Gunther-Struyf!):

Points = arrayfun(@(ii) myStruct(ii).travelTime(60,46,75),1:numel(myStruct));