2013-06-24 15 views
6

, böyle bir dizinin boyutlar arasında daraltabilirsiniz:Belirli bir boyut kümesinde diziyi nasıl daraltılır? Matlab içinde

M  = rand(3,4,5); 
myvec = M(:);  % gives a 60-element vector 

Ben serialising veya düzleştirme denilen düşünüyorum. Öğelerin sırası önce dim1, sonra dim2, sonra dim3 olur - böylece [M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...] elde edersiniz.

Ama ne yapmak istediğim sadece ilk iki boyutta çöküşü:

mymatrix = M(:: , :); % something that works like this? 

12 x 5 matris vermek. Yani, örneğin,

[M(1,1,1) M(1,1,2) M(1,1,3) M(1,1,4) M(1,1,5) 
M(2,1,1) M(2,1,2) M(2,1,3) M(2,1,4) M(2,1,5) 
M(3,1,1) M(3,1,2) M(3,1,3) M(3,1,4) M(3,1,5) 
M(1,2,1) M(1,2,2) M(1,2,3) M(1,2,4) M(1,2,5) 
... 
] 

olsun mymatrix ilk boyutu "düzleştirilmiş" 1 ve özgün M 2. boyutları, ancak herhangi bir diğer boyutları koruyarak böylece.

Aslında bunu 5 boyutlu bir dizinin "orta 3 boyutları" için yapmam gerekiyor, bu yüzden genel bir çözüm harika olurdu! Örneğin. W=rand(N,N,N,N,N); mymatrix = W(:, :::, :), ne demek istediğimi görürseniz, N x N^3 x N matrisini vermelidir.

sayesinde

boyutu uzunluk bağımsız değişkenler biri için bir tutucu olarak köşeli parantezler ( []) ile

cevap

5

kullanımı reshape: [] hesaplamak reshape anlatır

sz = size(M); 
mymatrix = reshape(M, [], sz(end));  % # Collapse first two dimensions 

veya

mymatrix = reshape(M, sz(1), [], sz(end)); % # Collapse middle dimensions 

tutucu boyut otomatik olarak. []'un yalnızca bir oluşumunu kullanabileceğinizi unutmayın. Diğer tüm uzunluklar açıkça belirtilmelidir.

+0

Mükemmel teşekkürler! Yeniden şekillendirmeyi düşünmeliydin. PS Sadece işe yarayacak başka bir yol düşündüm: tmp = permute (M, [1,5,2,3,4]); ', mymatrix = tmp (:, :)'. Her zaman işe yarayacağından emin değil misiniz? Tabii ki yeniden şekillendirmek ** çok fazla tercih edilir. –

İlgili konular