2010-02-13 9 views
23

Ho una matrice 3d (n-by-m-by-t) in MATLAB che rappresenta le misurazioni n-by-m in una griglia per un periodo di tempo. Mi piacerebbe avere una matrice 2d, in cui le informazioni spaziali è andato e solo n*m misurazioni nel tempo t sono lasciati (es: n*m-by-t)Risagoma matrice 3d su matrice 2d

Come posso fare questo?

risposta

28

È necessario il comando reshape:

Di 'la tua matrice iniziale è (solo per me per ottenere alcuni dati):

a=rand(4,6,8); 

Quindi, se gli ultimi due coordinate sono spaziale (il tempo è 4, m è 6, n è 8) si utilizza:

-10110

e si finisce con un array 4x48.

Se i primi due sono spaziale e l'ultimo è volta (m è 4, n è 6, il tempo è 8) si utilizza:

a=reshape(a,[24 8]); 

e si finisce con una matrice 24x8.

Ciò è un facile O (1) il funzionamento, (solo regolandola intestazione di ciò che la forma dei dati è). Ci sono altri modi per farlo, ad es. a=a(:,:) per condensare le ultime due dimensioni, ma la risagoma è più veloce.

11

Reshape è ovviamente la soluzione standard per rimodellare un array. (Cos'altro chiamerebbero?) Ci sono ancora alcuni trucchi da scoprire.

Innanzitutto, il modo più semplice per trasformare una matrice di dimensioni [n, m, p] in una matrice di dimensioni [n * m, p]?

B = reshape(A,n*m,p); 

Ma meglio è questo:

B = reshape(A,[],p); 

Se si lascia uno degli argomenti per rimodellare vuota, quindi ridisegnare calcola le dimensioni per voi! Fai attenzione, se provi questo e la dimensione di A non è conforme, avrai un errore. Così:

reshape(magic(3),[],2) 
??? Error using ==> reshape 
Product of known dimensions, 2, not divisible into total number of elements, 9. 

Logicamente, non possiamo creare un array con due colonne da qualcosa che contiene 9 elementi. Ho inserito una funzione denominata wreshape sullo scambio MATLAB Central che si occuperebbe di eseguire le operazioni necessarie senza eseguire l'operazione.

Naturalmente, è sempre possibile utilizzare trucchi come

B = A(:); 

per creare un vettore direttamente da una matrice. Ciò equivale a forma

B=reshape(A,[],1); 
1

Una soluzione migliore a questo problema è quello di utilizzare nshape.m disponibile da Rasmus Bro N-Way Toolbox. Ciò ti permetterà di risagomare lungo una data modalità, che è un po 'più complicata con il comando di rimodella.

La casella degli strumenti è disponibile al seguente link:

https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

Ci sono alcuni altri strumenti eccellenti lì per aiutare con la gestione di array pure.