2

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

谢谢, 卡姆兰

4

2 回答 2

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解决方案是最慢的。

于 2013-06-20T09:30:19.087 回答
3

要从In Matlab 中复制一个不错的答案,如何对嵌套结构的顺序进行排序?(感谢@Gunther-Struyf!):

Points = arrayfun(@(ii) myStruct(ii).travelTime(60,46,75),1:numel(myStruct));
于 2013-06-20T09:25:04.117 回答