Loren on the Art of MATLABTurn ideas into MATLAB

Note

Loren on the Art of MATLAB has been archived and will not be updated.

Reversal of a sort

We can sometimes be motivated to reverse things in Boston. And I occasionally get asked how to reverse the sort direction from MATLAB. So instead of sorting A and then having B follow the new order, let's undo a sorting operation, and in a way that multiple vectors could benefit, if necessary.

Forward Sorting

To sort multiple additional vectors in the same way as an initial one, we can easily take advantage of the sort index.

A = [1 8 3 17 0 4 7];
[sortA, ind] = sort(A);
B = [2 5 6 1 9 3 8];
sortBbyA = B(ind);
sortB = sort(B);

Here are the indices required to rearrange A into sortA.

ind
ind =
5     1     3     6     7     2     4


And here's a comparison of the original vectors and the ones sorted by the order in A.

[A;B]
[sortA;sortBbyA]
ans =
1     8     3    17     0     4     7
2     5     6     1     9     3     8
ans =
0     1     3     4     7     8    17
9     2     6     3     8     5     1


You can see that each number in A still corresponds to the same value from B after each vector has been sorted based on A.

Now let's have a look at the variants of the vector B.

[B;sortB;sortBbyA]
ans =
2     5     6     1     9     3     8
1     2     3     5     6     8     9
9     2     6     3     8     5     1


You can see that sorting B according to A (the 3rd row) is distinct from sorting B directly (second row).

Reverse Sorting

Suppose instead, I want all my vectors to be sorted the same way that the original A is sorted. I can still use the index from sort but in a different way.

unsorted = 1:length(A);
newInd(ind) = unsorted
newInd =
2     6     3     7     1     4     5


We are now in a position to undo the original sorting of A and apply the rearrange variants of B the same way. First we'll work with the variant of B based on sorting from A.

newA = sortA(newInd);
newBfromA = sortBbyA(newInd);
isequal([newA;newBfromA],[A;B])
ans =
1


Now let's compare several variants: B, the regular sorting of B, B sorted by A, and the sorted B rearranged according to the reverse sorting of A

newB = sortB(newInd);
[B;sortB;sortBbyA;newB]
ans =
2     5     6     1     9     3     8
1     2     3     5     6     8     9
9     2     6     3     8     5     1
2     8     3     9     1     5     6


Help Me Here

Now I've shown how to use the direct sorting indices of a vector to reverse sort another vector. I can even vaguely recall needing to do this once, but I can no longer remember why. Do you use this construct? Can you tell me some applications? I'd love to hear about them; please post here.

Published with MATLAB® 7.5

|