2016-05-03 21 views
7

Questa domanda è fondamentalmente un'estensione di that question."Desort" una matrice. Annullare l'ordinamento in Matlab

Ho una matrice di A in Matlab e desidera ordinare quella matrice lungo una sola dimensione:

A = rand(3,3,5); [B idx] = sort(A,3);

Ora idx è una matrice contenente il "risolto" indici. Come posso recuperare la matrice A utilizzando solo B e idx?

The answer della domanda originale non funziona per le matrici, sfortunatamente.

+0

Hai provato 'w (ix,:) = v', dove': 'rappresenta le dimensioni" ignorate "? – Crowley

+0

Intendi nel mio caso qualcosa del tipo: w (:,:, idx) = B? Questo non funziona a causa della "mancata corrispondenza nella quota dell'assegnazione". – Ethunxxx

+0

'w (idx) = B' funziona ma non è corretto – shamalaia

risposta

4

È necessario ordinare gli indici idx per recuperare gli indici originali. Il resto del lavoro richiederebbe ottenere gli indici di riga e colonna formattati corrispondenti a tutti quegli indici dim-3. L'implementazione sarebbe simile a questa -

[~,dim3idx] = sort(idx,3); 

[m,n,r] = size(B); 
[rowidx,colidx,~] = ndgrid(1:m,1:n,1:r); 

Aout = B(sub2ind(size(B),rowidx,colidx,dim3idx)) 

Si prega di notare che per le prestazioni, si può ottenere gli indici lineari generati da sub2ind alternativa con bsxfun direttamente dai parametri di dimensione e quindi anche evitare ndgrid, in questo modo -

Aout = B(bsxfun(@plus,bsxfun(@plus,(1:m)',m*(0:n-1)),m*n*(dim3idx-1)))