2016-05-03 19 views
7

To pytanie jest w zasadzie rozszerzeniem that question."Desortuj" matrycę. Cofnij sortowanie w Matlab

mam matrycę A w Matlab i chcą uporządkować tę matrycę wzdłuż jednego wymiaru:

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

Teraz idx jest macierzą zawierającą „posortowane” indeksów. Jak mogę odzyskać matrycę A przy użyciu tylko B i ?

The answer pierwotnego pytania nie działa dla macierzy, niestety.

+0

Czy próbowałeś 'w (ix,:) = v', gdzie': 'reprezentuje" ignorowane "wymiary? – Crowley

+0

Masz na myśli w moim przypadku coś takiego: w (:,:, idx) = B? To nie działa z powodu "Niezgodności wymiaru przydziału zależnego." – Ethunxxx

+0

'w (idx) = B' działa, ale jest niepoprawny – shamalaia

Odpowiedz

4

Musisz posortować indeksy idx, aby odzyskać oryginalne indeksy. Reszta prac wymaga uzyskania sformatowanych indeksów wierszy i kolumn odpowiadających wszystkim indeksom dim-3. Realizacja będzie wyglądać mniej więcej tak -

[~,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)) 

Należy pamiętać, że do wykonania, można uzyskać liniowe indeksów generowane przez sub2ind alternatywnie z bsxfun bezpośrednio z parametrami wielkości, a tym samym również uniknąć ndgrid, jak tak -

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