2013-06-24 4 views
6

In Matlab, possiamo comprimere attraverso le dimensioni di un array come questo:Come comprimere un array attraverso un insieme specifico di dimensioni?

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

Credo sia chiamato serializzazione o appiattimento. L'ordine degli elementi è prima dim 1, poi dim2, quindi dim3, quindi ottieni [M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...].

Ma ciò che voglio fare è collasso solo lungo le prime due dimensioni:

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

invia una matrice di 12 x 5. Così, per esempio, si ottiene

[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) 
... 
] 

in modo che la prima dimensione del mymatrix è il "appiattita" 1 ° e 2 ° dimensioni dell'originale M, ma conservando eventuali altre dimensioni.

In realtà ho bisogno di fare questo per le "3 dimensioni medie" di un array 5-dimensionale, quindi una soluzione generale sarebbe grandiosa! per esempio. W=rand(N,N,N,N,N); mymatrix = W(:, :::, :) dovrebbe dare una matrice N x N^3 x N se vedi cosa intendo.

Grazie

risposta

5

Usa reshape con parentesi quadre ([]) come segnaposto per uno degli argomenti di lunghezza dimensione:

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

o

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

Il segnaposto [] dice reshape per calcolare la dimensione automaticamente. Si noti che è possibile utilizzare una sola occorrenza di []. Tutte le altre dimensioni devono essere specificate esplicitamente.

+0

Perfetto, grazie! Avrei dovuto pensare a rimodellare. PS Ho appena pensato ad un altro modo che sembra funzionare: 'tmp = permute (M, [1,5,2,3,4]);', 'mymatrix = tmp (:, :)'. Non sono sicuro che funzionerà sempre? Ovviamente 'reshape' è ** molto ** preferibile. –