在Matlab中对方形对角矩阵的每一行中的元素重新排序

时间:2017-05-02 13:51:14

标签: matlab

我在Matlab中有一个维度A的方形对称矩阵n,我想按升序对每行中的元素重新排序,但保留对称性而不触及对角元素。

E.g。

 n=4;
 A=[10 9 8 7; 9 6 5 4; 8 5 3 2; 7 4 2 1];
 %reorder A in order to obtain
 B=[10 7 8 9; 7 6 4 5; 8 4 3 2; 9 5 2 1];

你能提供一些帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以使用triu仅对上三角进行排序,然后添加转置以保持对称。最后只需将对角线设置为原始矩阵:

n=4;
A=[10 9 8 7; 9 6 5 4; 8 5 3 2; 7 4 2 1];
% upper triangle indexes
UI = triu(true(size(A)),1);
% upper triangle of A
B = triu(A,1);
% assign inf to diagonal and below - important if there are any negative values in A
B(~UI) = -inf;
% sort rows descending order
B = sort(B,2,'ascend');
% set infs to 0
B(isinf(B)) = 0;
% add lower triangle matrix
B = B + B.';
% set diagonal as original A
B(1:n+1:n^2) = diag(A)

答案 1 :(得分:1)

A = [10 9 8 7; 
      9 6 5 4; 
      8 5 3 2; 
      7 4 2 1];    
B = sort(triu(A,1),2) + diag(diag(A)) + sort(triu(A,1),2)';

解释

triu(A,1)得到主对角线上方的上三角矩阵,即

ans0 =

     0     9     8     7
     0     0     5     4
     0     0     0     2
     0     0     0     0

sort(triu(A,1),2)按升序对上述结果的每一行中的元素进行排序,即

ans1 =

     0     7     8     9
     0     0     4     5
     0     0     0     2
     0     0     0     0

diag(diag(A))获得A的对角线,即

ans2 =

    10     0     0     0
     0     6     0     0
     0     0     3     0
     0     0     0     1

sort(triu(A,1),2)'获取已排序的上三角矩阵的转置,即

ans =

     0     0     0     0
     7     0     0     0
     8     4     0     0
     9     5     2     0

添加ans1ans2ans3,您将获得B