2016-08-04 152 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