我在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];
你能提供一些帮助吗?
答案 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
添加ans1
,ans2
和ans3
,您将获得B
。