我有一个距离在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
答案 0 :(得分:0)
还有另一个可以解决问题的Matlab函数sortrows(C,colummn_index)
。它可以根据特定列中的元素对行进行排序。因此,如果您转置矩阵A
(C = 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