2016-08-04 154 views
2

如果我有像这样一个矩阵:拆分大型矩阵为新的更小的矩阵

x = rand(256,144160); 

我怎样才能把它分解成更小的矩阵是256 x 901

我试过mat2cell(x,256,901),但我得到这个错误:

Input arguments, D1 through D2 , must sum to each dimension of the input matrix size, [256 144160].'

回答

5

那是因为你没有使用正确mat2cell。你需要做的是指定你想如何分割出每个维度。第一个层面是好的,只要你想每个矩阵有256行,但对于第二个维度需要144160/901 = 160矩阵与901列每个矩阵。

这样,就需要用901指定160个的值的矢量的每个元素:

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

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

mat2cell的输出将创建一个矩阵的单元阵列,您可以使用y{k}来访问矩阵。花括号非常重要。但是,如果我能推荐一下,我不会用mat2cell,你或许应该使用reshape,并创建一个三维矩阵,其中每个256 x 901

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

使用电池阵列是非常低效的,因为它被设计成成为通用容器。如果您打算进行数值分析,或者如果您想一次访问多个矩阵,请使用纯数字类型。使用reshape的另一个好处是可以避免令人头疼的是你总共需要160个矩阵。借助于此,就可以离开尺寸空(即[])它告诉reshape命令自动确定如何填充在基质x给出的元件该尺寸中的一个。请注意,我已经在第三方面明智地做到了这一点。换句话说,它会为第三维自动计算160。在这里,y(:,:,k)给你第k个矩阵,是3D矩阵y的第k个

+3

'reshape' FTW ... +1 – beaker