Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 用另一个矩阵对矩阵中的行元素进行排序_Matlab_Sorting - Fatal编程技术网

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

Matlab 用另一个矩阵对矩阵中的行元素进行排序,matlab,sorting,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] 另一个矩阵A具有相同行数(3个位置),其中A(i,:)对应于选择位置i的人 例如,对于位置1,人员1和3拾取了它 没人选2号位置 第二和第四个人选择了第三个位置 A=[1 3 0 0 0 0 2 4 0] 我想根据最接近它所代表的位置的人对A的每一行重新排序。 在本例中,对于位置1,基于D,人员1比人

我有一个3个地方和4个人之间距离的矩阵D 示例D(2,3)=10表示人员3远离10个单元中的位置2

D=[23 54 67 32
   32 5  10  2
   3  11  13 5]
另一个矩阵A具有相同行数(3个位置),其中A(i,:)对应于选择位置i的人

例如,对于位置1,人员1和3拾取了它 没人选2号位置 第二和第四个人选择了第三个位置 A=[1 3 0 0 0 0 2 4 0]

我想根据最接近它所代表的位置的人对A的每一行重新排序。 在本例中,对于位置1,基于D,人员1比人员3更接近位置1,因此无需执行任何操作。 地点2无事可做 位置3有一个变化,因为人4比2更接近位置3d(3,2)>D(3,4)

结果应该是

A=[1  3  
   0  0  
   4  2 ]
A中的每一行(位置)可以有0个或多个非零元素(拾取它的人)

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


还有一个Matlab函数可以实现这一点。它可以根据特定列中的元素对行进行排序。因此,如果您转置矩阵
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
全部清除
D=[23546732;
32 5  10  2;
3  11  13 5];
A=[10;
3  0;  
4  2 ];
%对矩阵A的每一行中的元素进行排序,
%因为矩阵D中每行元素的索引总是
%上升。
A_排序=排序(A,2);
%将每行中的所有零移到末尾
对于i=1:长度(A_排序(:,1))
num_zeros=sum(A_排序(i,:)=0);
如果num_zeros<长度(A_排序(i,:))
z=零(1,num_零);
A_排序(i,:)=[A_排序(i,num_零+1:长度(A_排序(i,:)))z];
结束;
结束;
%在内存中预先定位内存中相应元素的关联数组
%矩阵Dr只是矩阵D的一个简化推导。
Dr=0(长度(A_排序(:,1)),长度(A_排序(1,:)));
%创建D中元素的矩阵Dr,对应于已排序的矩阵a_。
对于i=1:length(A_排序(:,1))%i=1:3
对于j=1:length(A_排序(1,:)%j=1:2
如果A_排序(i,j)==0
Dr(i,j)=0;
其他的
Dr(i,j)=D(i,A_)(i,j));
结束;
结束;
结束;
%我们不再需要矩阵A_排序了
清除已排序的
%为了使用函数SORTROWS,我们需要转置矩阵
A=A';
Dr=Dr';
%实际的排序过程从这里开始。
对于i=1:length(A(1,:)%i=1:3
C=零(长度(A(:,1)),2);%缓冲矩阵
C(:,1)=A(:,i);
C(:,2)=Dr(:,i);
C=sortrows(C,2);
A(:,i)=C(:,1);
%将每列中的所有零移到末尾
num_zeros=sum(A(:,i)==0);
如果num_零<长度(A(:,i))
z=零(1,num_零);
A(:,i)=[A(num_zeros+1:length(A(:,i)),i)z];
结束;
结束;
%将矩阵调回原处
A=A';
清除C Dr z

这是什么语言?是Matlab吗?您应该将语言添加为标记。但是这里的排序是基于矩阵D而不是单个列的。我不太清楚您希望如何对矩阵进行排序。你能更清楚地解释一下吗?下一个问题是:为什么A不是矩阵3x4?例如,如果所有人都选择第一个位置,那么矩阵A的第一行中应该有4个元素,如下所示:A=[1 3 2 4;0 0 0;0 0 0 0]。对吗?因此,矩阵A是如何形成的还不清楚,虽然它的含义很清楚,但它与矩阵A的形式并不对应。如果假设5人选择位置1,2人选择位置2,没有人选择位置,那么A将有5列(基于最长的赋值)。对于位置2和3,末端的柱将用0填充。如果最多选择3人的位置,则矩阵A的大小为3x3,依此类推。其大小因作业而异。但在您的案例中,最长的作业由2人完成:2人选择地点1,2人选择地点3。因此,列的数量应该是2,但是矩阵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