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