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 维向量?的主要内容,如果未能解决你的问题,请参考以下文章

this对象原型

Pandas pipe: 一种更优雅的数据预处理方法!

js 基础 关于this

C++11 是不是提供了一种更好的方式来动态连接字符串?

C++ functional模板 #include <functional>(提供了一种更通用的函数绑定和调用机制)

C++ functional模板 #include <functional>(提供了一种更通用的函数绑定和调用机制)