23

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

我怎样才能做到这一点?

4

3 回答 3

28

你需要命令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(:,:)压缩最后两个维度,但重塑更快。

于 2010-02-13T08:45:28.797 回答
11

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

首先,最简单的方法是将大小为 [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);
于 2010-02-13T13:33:10.913 回答
0

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

该工具箱可在以下链接中找到:

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

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

于 2013-11-20T19:08:19.440 回答