Inverse of sorting arrangement

37 次查看(过去 30 天)
[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)?

采纳的回答

Stephen23
Stephen23 2018-10-4
编辑:Stephen23 2023-6-27
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 个评论
Mohamed Eldin
Mohamed Eldin 2023-6-27
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 2023-6-27
@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));

请先登录,再进行评论。

更多回答(2 个)

Matt J
Matt J 2018-10-4
编辑:Matt J 2018-10-4
[B,I] = sort(A);
J=1:numel(I);
J(I)=J;
  2 个评论
Robert
Robert 2020-7-28
Surprisingly, even this works:
[B,I] = sort(A);
J(I) = 1:numel(I);
Matt J
Matt J 2020-7-28
Yes, but it can have unintended effects if J is a pre-existing variable in the workspace.

请先登录,再进行评论。


Bruno Luong
Bruno Luong 2023-6-27
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 个评论
Bruno Luong
Bruno Luong 2023-6-27
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.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Shifting and Sorting Matrices 的更多信息

标签

产品


版本

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by