Inverse of sorting arrangement

34 visualizzazioni (ultimi 30 giorni)
Paolo Binetti
Paolo Binetti il 4 Ott 2018
Commentato: Stephen23 il 27 Giu 2023
[B,I] = sort(A) output is such that B = A(I). What would be the most efficient way to rather get B and J, such that A = B(J)?

Risposta accettata

Stephen23
Stephen23 il 4 Ott 2018
Modificato: Stephen23 il 27 Giu 2023
Assuming that A is a vector:
[B,I] = sort(A);
[~,J] = sort(I);
B(J)
If you have a matrix/array, then you first need to define what the intended effect is: to sort elements along one dimension (e.g. separately sort each column or row of a matrix) or to sort the rows atomically (i.e. using SORTROWS).
  4 Commenti
Mohamed Eldin
Mohamed Eldin il 27 Giu 2023
I used the command "sortrows" and it worked perfectly
as in the following example:
[Indata,id] = sortrows(InData,1); % sort InData
[~,ids] = sortrows(id,1); % sort the index
InData_returne = Indata(ids,:); % return InData again
Stephen23
Stephen23 il 27 Giu 2023
@Mohamed Eldin: you do not need the 2nd SORTROWS, a simple SORT is quite sufficient:
[B,I] = sortrows(A,1);
[~,J] = sort(I);
A = B(J,:);
Also note that if you are only sorting one column instead of SORTROWS you could use indexing & SORT:
[B,I] = sort(A(:,1));

Accedi per commentare.

Più risposte (2)

Matt J
Matt J il 4 Ott 2018
Modificato: Matt J il 4 Ott 2018
[B,I] = sort(A);
J=1:numel(I);
J(I)=J;
  2 Commenti
Robert
Robert il 28 Lug 2020
Surprisingly, even this works:
[B,I] = sort(A);
J(I) = 1:numel(I);
Matt J
Matt J il 28 Lug 2020
Yes, but it can have unintended effects if J is a pre-existing variable in the workspace.

Accedi per commentare.


Bruno Luong
Bruno Luong il 27 Giu 2023
If A has distinct elements such as
A = rand(1,10)
A = 1×10
0.0113 0.2350 0.1021 0.4269 0.9673 0.4399 0.3871 0.0288 0.5912 0.1876
a single line command is
[B,~,J] = unique(A);
Check
J
J = 10×1
1 5 3 7 10 8 6 2 9 4
B(J)
ans = 1×10
0.0113 0.2350 0.1021 0.4269 0.9673 0.4399 0.3871 0.0288 0.5912 0.1876
  1 Commento
Bruno Luong
Bruno Luong il 27 Giu 2023
If A has non distinct element, then the above method gives B that is shorter than A (and B has distinct elements) and
B(J) = A
still hold.

Accedi per commentare.

Tag

Prodotti


Release

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by