将 3d 矩阵重塑为 2d 矩阵

Posted

技术标签:

【中文标题】将 3d 矩阵重塑为 2d 矩阵【英文标题】:Reshape 3d matrix to 2d matrix 【发布时间】:2011-01-16 10:45:25 【问题描述】:

我在 MATLAB 中有一个 3d 矩阵 (n-by-m-by-t),表示一段时间内网格中的n-by-m 测量值。我想要一个二维矩阵,其中空间信息消失了,只剩下n*m 随时间推移的测量值t(即:n*m-by-t

我该怎么做?

【问题讨论】:

【参考方案1】:

你需要命令reshape:

假设你的初始矩阵是(仅供我获取一些数据):

a=rand(4,6,8);

那么,如果最后两个坐标是空间坐标(时间为 4,m 为 6,n 为 8),您使用:

a=reshape(a,[4 48]);

你最终得到一个 4x48 数组。

如果前两个是空间的,最后一个是时间(m 是 4,n 是 6,时间是 8)你使用:​​

a=reshape(a,[24 8]);

你最终得到一个 24x8 数组。

这是一个快速的 O(1) 操作(它只是调整数据形状的标题)。还有其他方法可以做到这一点,例如a=a(:,:) 压缩最后两个维度,但 reshape 更快。

【讨论】:

【参考方案2】:

重塑当然是重塑数组的标准解决方案。 (他们还会怎么称呼它?)还有一些技巧需要发现。

首先,最简单的方法是将大小为 [n,m,p] 的数组转换为大小为 [n*m,p] 的数组?

B = reshape(A,n*m,p);

但更好的是:

B = reshape(A,[],p);

如果您将 reshape 的参数之一留空,那么 reshape 会为您计算大小!小心,如果你尝试这个并且 A 的大小不符合,那么你会得到一个错误。因此:

reshape(magic(3),[],2)
??? Error using ==> reshape
Product of known dimensions, 2, not divisible into total number of elements, 9.

从逻辑上讲,我们不能从包含 9 个元素的东西中创建一个包含两列的数组。我确实在 MATLAB Central 交换器上放置了一个名为 wreshape 的函数,它会根据需要填充以执行此操作而不会产生错误。

当然,你总是可以使用类似的技巧

B = A(:);

直接从矩阵创建向量。这相当于表格

B=reshape(A,[],1);

【讨论】:

【参考方案3】:

此问题的更好解决方案是使用 Rasmus Bro 的 N-Way 工具箱中提供的 nshape.m。这将允许您沿着给定的模式重塑,这对于重塑命令来说有点棘手。

工具箱可在以下链接获得:

https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

还有其他一些出色的工具可以帮助进行数组操作。

【讨论】:

以上是关于将 3d 矩阵重塑为 2d 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用正交矩阵将 3D 坐标转换为 2D 屏幕坐标

在 numpy 中从具有索引的 2D 矩阵构建 3D 布尔矩阵

不支持 Simulink 中可以是 2D 的 3D 矩阵

如何将 3D 协方差矩阵投影到给定的图像平面(姿势)

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵

单独的3D矩阵像numpy