MATLAB 是不是提供了一种更优雅的方式来遍历 3D 数组以获取 3 维向量?
Posted
技术标签:
【中文标题】MATLAB 是不是提供了一种更优雅的方式来遍历 3D 数组以获取 3 维向量?【英文标题】:Does MATLAB offer a more elegant way to iterate through 3D array to get 3rd dimension vectors?MATLAB 是否提供了一种更优雅的方式来遍历 3D 数组以获取 3 维向量? 【发布时间】:2014-01-31 23:05:05 【问题描述】:我正在尝试遍历一个固定大小的 3d 数组,以便像这样绘制第三个向量维度:
%respo is a 3D array of fixed size defined above
for ii = 1:size(respo,1)
for jj = 1:size(respo,2)
plot(squeeze(respo(ii,jj,1:8)))
end
end
有没有更好的方法来做到这一点,而不是通过 2 级 for 循环精确指向每次迭代时绘制的向量?
我知道 MATLAB 中的每个数组都有一个线性索引,但我很难想出一种从双循环中保存的方法。
【问题讨论】:
如今,不惜一切代价避免循环已不再重要。特别是如果代码在这里清晰可读,我会保留它们。 我不得不说我发现答案和所有 cmets 都很有用,所以谢谢你们!然而,@luis-mendo 的 one-liner 是我使用的,因为它在最大程度上促进了这些 MATLAB 函数的设计。 【参考方案1】:好吧,我猜你可以把它改造成只需要一个循环:
respo_2D = reshape(respo, [], size(respo,3))
现在
for ii = 1:size(respo_2D, 1)
plot(respo(ii,1:8));
end
(甚至可能是plot(respo_2D(:,1:8)')
,具体取决于您要做什么)
【讨论】:
【参考方案2】:plot
应用于矩阵绘制该矩阵的列。所以:重新排列维度,使第三个成为新的第一个,其他的合并到新的第二个,然后调用plot
plot(reshape(permute(respo, [3 1 2]), size(respo,3), []))
【讨论】:
这似乎是要走的路,请注意,如果原始代码将使用hold on
而不是hold all
,则可以通过添加,'b'
作为绘图命令的附加输入来模仿这一点。 以上是关于MATLAB 是不是提供了一种更优雅的方式来遍历 3D 数组以获取 3 维向量?的主要内容,如果未能解决你的问题,请参考以下文章