How to sort rows of a 2D array based on another array
7 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
DGM
2023-2-3
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)
更多回答(1 个)
Vilém Frynta
2023-2-3
编辑:Vilém Frynta
2023-2-3
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])'
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrices and Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!