2013-12-10 19 views
6

Diciamo che ho una matrice tale che A(:,:,1)=[1,2,3;2,3,4], A(:,:,2)=[3,4,5;4,5,6].Rimozione della terza dimensione della matrice

Come è il modo più semplice di accedere e tracciare i vettori (1,2,3), (2,3,4), (3,4,5), (4,5,6). Ho provato a creare B=[A(:,:,1);A(:,:,2)], ma ho bisogno di una procedura per il numero arbitrario di A.

Spero che questo non sia banale e che mi sono formulato in modo soddisfacente.

risposta

4

Supponendo che l'ordine non importa, ecco come si può fare per i vettori di lunghezza 3:

B = reshape(shiftdim(A,2), [], 3) 
plot(B') 

per i vettori di dimensioni arbitrarie, sostituire 3 da size(A,2)

5

Si dovrebbe pensare 'in verticale '. Questo vi permetterà di utilizzare l'indicizzazione del colon:

>> A(:,:,1) = [1,2,3;2,3,4].'; %'// NOTE: transpose of your original 
>> A(:,:,2) = [3,4,5;4,5,6].'; %'// NOTE: transpose of your original 
>> A(:,:) 
ans = 
    1  2  3  4 
    2  3  4  5 
    3  4  5  6 

L'indicizzazione colon con due punti funziona per qualsiasi dimensione A:

>> A(:,:,:,:,1,1) = [1 2 3; 2 3 4].'; %' 
>> A(:,:,:,:,2,1) = [3 4 5; 4 5 6].'; %' 
>> A(:,:,:,:,1,2) = [5 6 7; 6 7 8].'; %' 
>> A(:,:,:,:,2,2) = [7 8 9; 8 9 0].'; %' 
>> A(:,:) 
ans = 
    1  2  3  4  5  6  7  8 
    2  3  4  5  6  7  8  9 
    3  4  5  6  7  8  9  0 

Colon indicizzazione in MATLAB è molto interessante e davvero potente una volta padrone di esso. Ad esempio, se si utilizza un numero di due punti inferiore rispetto all'array di dimensioni (come sopra), MATLAB concatenerà automaticamente il resto dei dati lungo la dimensione uguale al conteggio dei due punti.

Quindi, se A dispone di 48 dimensioni, ma è indice con solo 2 due punti: si otterrà una matrice 2D, che è la concatenazione delle restanti 46 dimensioni lungo la dimensione 2 ° .

In generale: se A ha N dimensioni, ma è indice con appena due punti M ≤ N: si otterrà una serie -D M, che è la concatenazione delle restanti N-M dimensioni lungo la M° dimensione.

Quindi, fintanto che si è liberi di definire il A per contenere i vettori sulle colonne piuttosto che i righe (si dovrebbe consigliare a tutti di fare questo, come praticamente tutto ciò che in MATLAB è un po 'più veloce in questo modo) , Penso che questo sia il modo più veloce ed elegante per fare ciò che vuoi.

caso contrario, beh, allora appena reshape come Dan :)

+1

+1 per l'uso perspicace del: Operatore! – bla

Problemi correlati