Matlab:如何根据Matrix A中的信息在Matrix B中定位数据?

时间:2012-02-16 17:46:17

标签: matlab match

  

可能重复:
  Sort a matrix with another matrix

矩阵A('10 x 1000'所有数字)如下所示:

得分(1​​.1)得分(1.2)得分(1.3)......得分(1.1000)

得分(2.1)得分(2.2)得分(2.3)....得分(1.1000)

...

Matrix B('1 x 1000'所有数字):

返回(1)返回(2)返回(3).....返回(1.1000)

每次我对一行矩阵A进行排序时,我想根据矩阵A中排序行的顺序对矩阵B进行排序。因为矩阵A中有10行,矩阵B将被排序10次并生成新的Matrix C('10 x 1000')像这样:(我正在寻找一个脚本来生成这个Matrix C)

返回(3)返回(25)返回(600).......返回(1000)

返回(36)返回(123)返回(2)........返回(212)

.... ....

3 个答案:

答案 0 :(得分:1)

这应该做你想要的:

A = randn(10,1000);
B = randn(1,1000);
C = zeros(size(A));

for i = 1:10
    [a idx] = sort(A(1,:));
    A(i,:) = a;
    C(i,:) = B(idx);
end

现在A行已排序,C行包含相应的已排序B

答案 1 :(得分:1)

这个解决方案更加紧凑,当你的矩阵变大时,习惯于使用这种解决方案来提高效率也是很好的。您可以通过两个想法来解决您的问题:

  1. [a, ix] = sort(X)中,a是X的列排序版本,ix存储哪些行移动到每列中的位置。 Thus if we do [a, ix] = sort(X.').';(其中点撇号是转置)我们可以对行进行排序。
  2. B(ix)其中ix是一堆indeces将使矩阵与ix相同,i-jt​​h元素在ix(i,j)处为B
  3. 然后你只需要重塑它。所以你可以这样做:

    A = rand(4,8);
    B = rand(1,8);
    n = size(A,1);
    m = size(A,2);
    
    [~,ix] = sort(A.');
    C = reshape(B(ix'),n,m);
    

答案 2 :(得分:0)

如果我正确理解您的问题,以下内容应该有效。使用一些样本分数:

>> score = [1 4 7 9; 3 5 1 7; 9 3 1 6]

score =

     1     4     7     9
     3     5     1     7
     9     3     1     6

和样本返回向量:

>> r = [10 20 30 40]

r =

    10    20    30    40

TransposeSORT命令起作用的分数和排序对矩阵的列起作用。我们只对排序值的索引感兴趣:

>> [~, ix] = sort(score')

ix =

     1     3     3
     2     1     2
     3     2     4
     4     4     1

现在转换这些索引并使用它们来引用返回值:

>> answer = r(ix)'

answer =

    10    20    30    40
    30    10    20    40
    30    20    40    10