2012-02-16 71 views
0

可能重复:
Sort a matrix with another matrixMatlab:如何根据矩阵A中的信息定位矩阵B中的数据?

矩阵A('10×1000' 的所有数值)看起来像这样:

得分(1.1)得分(1.2)评分( 1.3)....得分(1.1000)

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

...

矩阵B( '1×1000' 的所有数值):

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

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

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

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

.... ....

回答

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. [a, ix] = sort(X)a是列排序X版本,以及九店这行,其中每列中移动。 Thus if we do [a, ix] = sort(X.').';(其中点撇号是转置),我们可以对行进行排序。
  2. B(IX)其中I x是一堆的indeces会使一个矩阵的大小相同,在IX与第i-j个元素为乙IX(I,J)

然后你只需要重塑它。所以你可以这样做:

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); 
+0

哎呀,我忘了排序(A,2)将沿着行进行排序,所以上述可能会更简单一些。 – 2012-02-16 18:24:25

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 

Transpose得分和排序,因为在矩阵的列SORT命令作品。我们只是在排序值的索引感兴趣:

 
>> [~, 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