使用另一个矩阵对矩阵中的行元素进行排序

时间:2016-03-29 03:29:43

标签: matlab sorting

我有一个距离在3个地方和4个人之间的矩阵D. 例如D(2,3)= 10表示人3远离10个单位的第2位。

D=[23 54 67 32
   32 5  10  2
   3  11  13 5]

具有相同行数(3个位置)的另一个矩阵A,其中A(i,:)对应于选择的人员

地点1的例子,第1和第3人选择它 没有人选择的地方2 第2和第4人选中了第3名     A = [1 3 0        0 0 0        2 4 0]

我想要最接近它代表的地方的人重新排序A的每一行。 在这个例子中,对于地点1,人1比基于D的人3更接近它,​​所以无所事事。 与地方无关2 并且地方3有变化,因为人4比2更接近地放置3 D(3,2)> D(3,4)

结果应为

A=[1  3  
   0  0  
   4  2 ]

A中的每一行(地点)都可以有0个或多个非零元素(选择它的人)

基本上,我想基于D的行(最接近位置的第一个)对A的每一行中的元素进行重新排序,类似这样但是这里A和D的大小不同(列数)

    [SortedD,Ind] = sort(D,2)


    for r = 1:size(A,1)
        A(r,:) = A(r,Ind(r,:));
    end

1 个答案:

答案 0 :(得分:0)

还有另一个可以解决问题的Matlab函数sortrows(C,colummn_index)。它可以根据特定列中的元素对行进行排序。因此,如果您转置矩阵AC = A')并通过向末尾添加正确的列来扩展结果,根据您想要对所需行进行排序,那么您将获得所需的内容。

更具体地说,你可以这样做:

clear all

D=[23 54 67 32;
   32 5  10  2;
   3  11  13 5];

A=[1  0;  
   3  0;  
   4  2 ];

% Sort elements in each row of the matrix A,
% because indices of elements in each row of the matrix D are always
% ascending.
A_sorted = sort(A,2);
% shifting all zeros in each row to the end
for i = 1:length(A_sorted(:,1))
    num_zeros = sum(A_sorted(i,:)==0);
    if num_zeros < length(A_sorted(i,:))
        z = zeros(1,num_zeros);
        A_sorted(i,:) = [A_sorted(i,num_zeros+1:length(A_sorted(i,:))) z];
    end;
end;

% Prelocate in memory an associated array of the corresponding elements in
% D. The matrix Dr is just a reduced derivation from the matrix D.
Dr = zeros(length(A_sorted(:,1)),length(A_sorted(1,:)));

% Create a matrix Dr of elements in D corresponding to the matrix A_sorted.
for i = 1:length(A_sorted(:,1))  % i = 1:3
    for j = 1:length(A_sorted(1,:))  % j = 1:2
        if A_sorted(i,j) == 0
            Dr(i,j) = 0;
        else
            Dr(i,j) = D(i,A_sorted(i,j));
        end;
    end;
end;

% We don't need the matrix A_sorted anymore
clear A_sorted

% In order to use the function SORTROWS, we need to transpose matrices
A = A';
Dr = Dr';

% The actual sorting procedure starts here.
for i = 1:length(A(1,:))  % i = 1:3
    C = zeros(length(A(:,1)),2);  % buffer matrix
    C(:,1) = A(:,i);
    C(:,2) = Dr(:,i);
    C = sortrows(C,2);
    A(:,i) = C(:,1);
    % shifting all zeros in each column to the end
    num_zeros = sum(A(:,i)==0);
    if num_zeros < length(A(:,i))
        z = zeros(1,num_zeros);
        A(:,i) = [A(num_zeros+1:length(A(:,i)),i) z]';
    end;
end;

% Transpose the matrix A back
A = A';

clear C Dr z