抱歉,如果之前有人问过这个问题,找不到搜索。我有一个结构数组(大约 1000 个)。每个结构都有一个名为“travelTime”的字段,它是一个大小为“120x92x150”的 3D 矩阵。我需要查找所有 1000 个矩阵的某个位置的值,例如。index (60,46,75) 所以我会有一个包含 1000 个元素的数组。我可以在 for 循环中做到这一点,但有没有更简单、更优雅的方式(更快)?
谢谢, 卡姆兰
沿第四维连接所有内容,检索所有索引,然后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
解决方案是最慢的。
要从In Matlab 中复制一个不错的答案,如何对嵌套结构的顺序进行排序?(感谢@Gunther-Struyf!):
Points = arrayfun(@(ii) myStruct(ii).travelTime(60,46,75),1:numel(myStruct));