我有两个不同的矩阵A和B
A =
[7 8 9;
4 5 6]
B =
[22 32 12;
9 8 10]
sortB =
[12 22 32;
8 9 10]sortindex_B=[3 1 2;2 1 3];,即12在矩阵B的第三位置,22在第一位置,32在第二位置;第二行类似。
现在,我想根据Sortindex_B对A进行排序(即,在矩阵A中,我希望7作为第三个元素,8作为第一个元素,9作为第一行的第二个元素;对于第二行,类似地:第二个元素是4,第一个元素是5,第三个元素是6)。因此,结果应该如下所示:
A_final =
[8 9 7;
5 4 6] 我如何才能做到这一点?
发布于 2016-02-26 00:04:31
在对B进行排序时,您可以从sort命令中请求排序索引矩阵,然后将A作为一个单元格进行操作,从而使cellfun可用:
A = [7 8 9; 4 5 6];
B = [22 32 12; 9 8 10];
[sortB, I] = sort(B,2);
Icell = mat2cell(I,ones(1, size(I,1)),size(I,2));
Acell = mat2cell(A,ones(1, size(I,1)),size(I,2));
sortA = cell2mat(...
cellfun(@(x,y) y(x), Icell, Acell, 'UniformOutput', false))输出(您声明第一行输出为8 9 7,但您真的指的是9 7 8吗?)
sortA =
9 7 8
5 4 6用于您问题中特别指定的排序;重新映射索引矩阵I
A = [7 8 9; 4 5 6];
B = [22 32 12; 9 8 10];
[sortB, I] = sort(B,2);
%// re-map I
for i = 1:size(I,1)
Itmp = I(i,:);
for j = 1:size(I,2)
I(i,Itmp(j)) = j;
end
end
Icell = mat2cell(I,ones(1, size(I,1)),size(I,2));
ImapCell = mat2cell(Imap,ones(1, size(I,1)),size(I,2));
Acell = mat2cell(A,ones(1, size(I,1)),size(I,2));
sortA = cell2mat(...
cellfun(@(x,y) y(x), Icell, Acell, 'UniformOutput', false))输出
sortA =
8 9 7
5 4 6发布于 2016-02-26 00:21:16
使用dfri的答案中的sort和sub2ind的组合
A = [7 8 9;
4 5 6];
B = [22 32 12;
9 8 10];
[sortB, sortindex_B] = sort(B,2);
[~, colIdx] = sort(sortindex_B,2);
rowIdx = ndgrid(1:size(B,1),1:size(B,2));
idx = sub2ind(size(B),rowIdx,colIdx);
sortA = A(idx)
ans =
8 9 7
5 4 6发布于 2016-02-26 00:14:07
您必须使用sort函数返回的索引值逐行执行此操作。
像这样的东西应该可以做到这一点,并且可以扩展到矩阵A和B可能具有的任意数量的行。在继续之前,这也会验证A和B的大小是否相同。
B= [22 32 12; 9 8 10]
A = [7 8 9; 4 5 6];
assert(all(size(A) == size(B)));
sortB = zeros(size(B));
finalA= zeros(size(A));
for i = 1:size(B,1)
[sorted,idx] = sort(B(i,:));
sortB(i,:) = sorted;
tempA = A(i,:);
tempA = tempA(idx);
finalA(i,:) = tempA;
endhttps://stackoverflow.com/questions/35632094
复制相似问题