How to sort rows of a 2D array based on another array
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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
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
% use sub2ind()
ridx = repmat((1:sz(1)).',[1 sz(2)]);
idx = sub2ind(sz(1:2),ridx,cidx);
D = B(idx)
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])'
Siehe auch
Kategorien
Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!