Inverse of sorting arrangement

40 vues (au cours des 30 derniers jours)
Paolo Binetti
Paolo Binetti le 4 Oct 2018
Commenté : Stephen23 le 27 Juin 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)?

Réponse acceptée

Stephen23
Stephen23 le 4 Oct 2018
Modifié(e) : Stephen23 le 27 Juin 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 commentaires
Mohamed Eldin
Mohamed Eldin le 27 Juin 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 le 27 Juin 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));

Connectez-vous pour commenter.

Plus de réponses (2)

Matt J
Matt J le 4 Oct 2018
Modifié(e) : Matt J le 4 Oct 2018
[B,I] = sort(A);
J=1:numel(I);
J(I)=J;
  2 commentaires
Robert
Robert le 28 Juil 2020
Surprisingly, even this works:
[B,I] = sort(A);
J(I) = 1:numel(I);
Matt J
Matt J le 28 Juil 2020
Yes, but it can have unintended effects if J is a pre-existing variable in the workspace.

Connectez-vous pour commenter.


Bruno Luong
Bruno Luong le 27 Juin 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 commentaire
Bruno Luong
Bruno Luong le 27 Juin 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.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Shifting and Sorting Matrices dans Help Center et File Exchange

Tags

Produits


Version

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by