将大矩阵拆分成新的小矩阵

时间:2016-08-04 20:17:32

标签: matlab matrix

如果我有这样的矩阵:

x = rand(256,144160);

如何将其拆分为256 x 901的较小矩阵?

我尝试了mat2cell(x,256,901),但我收到了这个错误:

  

输入参数D1D2必须与输入矩阵大小的每个维度相加[256 144160].'

1 个答案:

答案 0 :(得分:5)

那是因为你没有正确使用mat2cell。您需要做的是指定您希望如何细分每个维度。第一个维度很好,因为您希望每个矩阵有256行,但对于第二个维度,您需要144160 / 901 = 160个矩阵,每个矩阵有901列。

因此,您需要为每个元素指定160个值为901的向量:

y = mat2cell(x, 256, 901*ones(1,160));

这告诉mat2cell你想要901个矩阵,其中每个矩阵是160列,并且都有256行。这揭示了错误消息所说的内容。它告诉你,你想要分割这个矩阵的方式,你要分割的每个维度都必须加起来与原始矩阵的大小相同。第一个维度设置为256,因此非常明显您希望所有矩阵都有256行。对于列,您必须具有160个矩阵,每个矩阵901列,因此加起来为160 x 901 = 144160。你只指定了901,因此MATLAB抱怨告诉你901 != 144160

mat2cell的输出创建了一个矩阵的单元格数组,用于访问k th 矩阵,您可以使用y{k}。花括号非常重要。但是,如果我可以推荐某些内容,我就不会使用mat2cell,您应该使用reshape并创建一个3D矩阵,其中每个切片256 x 901:< / p>

y = reshape(x, 256, 901, []);

使用单元格数组效率非常低,因为它被设计为通用容器。如果您计划进行数值分析,或者如果您想一次访问多个矩阵,请坚持使用纯数字类型。使用reshape的另一个好处是避免了解总共需要160个矩阵的麻烦。这样,您可以将其中一个维度留空(即[]),告诉reshape命令自动确定如何使用矩阵x中给出的元素填充此维度。请注意,我已经明智地完成了第三个维度。换句话说,它会为第三维自动计算160。这里,y(:,:,k)给出k th 矩阵,并且是3D矩阵y的k th 切片。