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

Pet*_*mit 23 matlab matrix reshape

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

我怎样才能做到这一点?

Ram*_*nka 28

你需要命令reshape:

说你的初始矩阵是(只为我获取一些数据):

a=rand(4,6,8);
Run Code Online (Sandbox Code Playgroud)

然后,如果最后两个坐标是空间的(时间是4,m是6,n是8),则使用:

a=reshape(a,[4 48]);
Run Code Online (Sandbox Code Playgroud)

你最终得到一个4x48阵列.

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

a=reshape(a,[24 8]);
Run Code Online (Sandbox Code Playgroud)

你最终得到一个24x8阵列.

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


小智 11

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

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

B = reshape(A,n*m,p);
Run Code Online (Sandbox Code Playgroud)

但更好的是:

B = reshape(A,[],p);
Run Code Online (Sandbox Code Playgroud)

如果你将其中一个参数重新整形为空,那么重塑会为你计算大小!小心,如果你尝试这个并且A的大小不符合,那么你将得到一个错误.从而:

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

从逻辑上讲,我们不能创建一个包含两列的数组,其中包含9个元素.我确实在MATLAB Central交换机上安装了一个名为wreshape的函数,该函数可以根据需要填充,无需生成错误.

当然,你总是可以使用像

B = A(:);
Run Code Online (Sandbox Code Playgroud)

直接从矩阵创建矢量.这相当于表格

B=reshape(A,[],1);
Run Code Online (Sandbox Code Playgroud)