首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对一个矩阵的行相对于另一个矩阵进行排序

对一个矩阵的行相对于另一个矩阵进行排序
EN

Stack Overflow用户
提问于 2016-02-25 23:51:44
回答 4查看 74关注 0票数 3

我有两个不同的矩阵AB

代码语言:javascript
复制
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_BA进行排序(即,在矩阵A中,我希望7作为第三个元素,8作为第一个元素,9作为第一行的第二个元素;对于第二行,类似地:第二个元素是4,第一个元素是5,第三个元素是6)。因此,结果应该如下所示:

代码语言:javascript
复制
A_final =
        [8 9 7;
         5 4 6] 

我如何才能做到这一点?

EN

回答 4

Stack Overflow用户

发布于 2016-02-26 00:04:31

在对B进行排序时,您可以从sort命令中请求排序索引矩阵,然后将A作为一个单元格进行操作,从而使cellfun可用:

代码语言:javascript
复制
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吗?)

代码语言:javascript
复制
sortA =

     9     7     8
     5     4     6

用于您问题中特别指定的排序;重新映射索引矩阵I

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
sortA =

     8     9     7
     5     4     6
票数 1
EN

Stack Overflow用户

发布于 2016-02-26 00:21:16

使用dfri的答案中的sortsub2ind的组合

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-02-26 00:14:07

您必须使用sort函数返回的索引值逐行执行此操作。

像这样的东西应该可以做到这一点,并且可以扩展到矩阵A和B可能具有的任意数量的行。在继续之前,这也会验证A和B的大小是否相同。

代码语言:javascript
复制
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;
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35632094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档