矩阵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)
.... ....
答案 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)
这个解决方案更加紧凑,当你的矩阵变大时,习惯于使用这种解决方案来提高效率也是很好的。您可以通过两个想法来解决您的问题:
[a, ix] = sort(X)
中,a
是X的列排序版本,ix存储哪些行移动到每列中的位置。 Thus if we do [a, ix] = sort(X.').';
(其中点撇号是转置)我们可以对行进行排序。然后你只需要重塑它。所以你可以这样做:
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
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