# How to sort rows of a 2D array based on another array

8 Ansichten (letzte 30 Tage)
Vojtech Vanecek am 3 Feb. 2023
Kommentiert: Vojtech Vanecek am 6 Feb. 2023
Hi,
I would like to ask how can I sort rows of one 2D array based on values in another 2D array with same dimensions without using loop. For example: Sort rows of B based on rows of A
A = [1 2 3;2 1 3;3 2 1]
B = [0 1 2;0 1 2;0 1 2]
the result is newB = [0 1 2;1 0 2;2 1 0]
My gimmicky solution using loop is:
[~,idx] = sort(A,2)
for i=1:height(B)
B(i,:) = B(i,idx(i,:))
end
Is there cleaner slution?
Thanks.
Vojta
##### 0 Kommentare-1 ältere Kommentare anzeigen-1 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

DGM am 3 Feb. 2023
Here's one example. I'm sure there are others.
A = [1 2 3;2 1 3;3 2 1];
B = [0 1 2;0 1 2;0 1 2];
% get sorting and size info
sz = size(B);
[~,cidx] = sort(A,2);
% sort in a loop
C = zeros(sz);
for r = 1:sz(1)
C(r,:) = B(r,cidx(r,:));
end
C
C = 3×3
0 1 2 1 0 2 2 1 0
% use sub2ind()
ridx = repmat((1:sz(1)).',[1 sz(2)]);
idx = sub2ind(sz(1:2),ridx,cidx);
D = B(idx)
D = 3×3
0 1 2 1 0 2 2 1 0
##### 1 KommentarKeine anzeigenKeine ausblenden
Vojtech Vanecek am 6 Feb. 2023
Thanks a lot. I did not know about the sub2ind function.

Melden Sie sich an, um zu kommentieren.

### Weitere Antworten (1)

Vilém Frynta am 3 Feb. 2023
Bearbeitet: Vilém Frynta am 3 Feb. 2023
Zdravím kolego, // Hello,
I have tried something. I can't say it's "cleaner solution", but it's without for loop. You basically unfold matrix into one vector, and then you do not need a loop.
% original variables
A = [1 2 3;2 1 3;3 2 1];
B = [0 1 2;0 1 2;0 1 2];
% modified variables -- make them into a vector
newB = B';
newB = newB(1:numel(B));
newIdx = A';
newIdx = newIdx(1:numel(B));
final_B = newB(newIdx);
final_B = reshape(final_B,[3 3])'
final_B = 3×3
0 1 2 1 0 2 2 1 0
##### 1 KommentarKeine anzeigenKeine ausblenden
Vojtech Vanecek am 6 Feb. 2023
Dobrý den/Hi,
thanks for the idea. Unfolding the matrix into a vector makes it easier.

Melden Sie sich an, um zu kommentieren.

### Kategorien

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

R2022a

### Community Treasure Hunt

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

Start Hunting!