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

时间:2010-02-13 08:16:05

标签: matlab matrix reshape

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

我该怎么做?

3 个答案:

答案 0 :(得分: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(:,:)缩小最后两个维度,但重塑速度更快。

答案 1 :(得分:11)

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

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

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

但更好的是:

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

如果你将其中一个参数重新整形为空,那么重塑会为你计算大小!小心,如果你尝试这个并且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);

答案 2 :(得分:1)

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

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

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

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