将 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 矩阵的主要内容,如果未能解决你的问题,请参考以下文章
在 numpy 中从具有索引的 2D 矩阵构建 3D 布尔矩阵