如果我有这样的矩阵:
x = rand(256,144160);
如何将其拆分为256 x 901
的较小矩阵?
我尝试了mat2cell(x,256,901)
,但我收到了这个错误:
输入参数
D1
到D2
必须与输入矩阵大小的每个维度相加[256 144160].'
答案 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 切片。