flip half of matrix over the diagonal to make a symmetric matrix
105 次查看(过去 30 天)
显示 更早的评论
Dear all, If I have a half of a matrix, e.g
1
2 3
4 5 6
7 8 9 10
...
I want to flip it over the diagonal to make a symmetric matrix:
1 2 4 7
2 3 5 8
4 5 6 9
7 8 9 10
Please help. Thanks
2 个评论
Jan
2016-5-4
Tghe solution depends on how the triangular "array" is stored. Are there zeros in the upper right elements?
John D'Errico
2016-5-4
Is the matrix stored as a matrix, so only the lower triangle, with zeros as the upper triangle. Or is there junk in the upper triangle? Or do you have the elements of the lower triangle, stored in a vector?
All of these things are pertinent to any efficient solution.
采纳的回答
Azzi Abdelmalek
2016-5-4
A=[1 0 0 0
2 3 0 0
4 5 6 0
7 8 9 10]
[n,m]=size(A);
B=A'+A
B(1:n+1:end)=diag(A)
3 个评论
Bill Tubbs
2020-5-28
I think you can do it in one line like this:
B = triu(A.',1) + tril(A) % Takes bottom half of A to make B symmetric
Also, this does not do a conjugate transpose.
更多回答(4 个)
Simon Liljestrand
2017-9-29
A=[1 0 0 0
2 3 0 0
4 5 6 0
7 8 9 10];
B=A'+triu(A',1)';
Ben McSeveney
2018-2-15
编辑:Stephen23
2018-2-15
If I have a column vector e.g.
1
2
3
How do I quickly create a symmetric matrix i.e.
[1 2 3;
2 1 2;
3 2 1]
?
3 个评论
Tom Davis
2018-2-15
[a,circshift(a,1),circshift(a,2)]
triu(a' - a + ones(size(a,1))) + tril(a - a' + ones(size(a,1))) - eye(size(a,1))
Rohit Sachdeva
2024-4-9
编辑:Rohit Sachdeva
2024-4-9
As most people have pointed out, I just wanted to add another way of doing this:
B = (A+A') - diag(diag(A));
The (A+A') part is clear to most of us. This is how the 2nd term works:
- First diag(.) extracts the diagonal elements of A.
- The next diag(.) creats a matrix with just those diagonal elements.
- Finally we subtract that matrix of diagonal elements from the (A+A') as required.
This eliminates the need of the eye(.) function. Hope it helps!
1 个评论
Steven Lord
2024-4-9
In general, this doesn't work.
A = magic(4)
B = (A+A') - diag(diag(A))
It does work if the matrix is real and one of the triangular parts already contains all 0 values.
C = triu(A)
D = (C+C') - diag(diag(C))
It doesn't work if the matrix is complex even if the matrix is triangular.
format shortg
C(1, 2) = 2+3i
D = (C+C') - diag(diag(C))
D is not symmetric, it is however Hermitian.
issymmetric(D)
ishermitian(D)
But if you used the non-conjugate transpose then the result is symmetric but not Hermitian:
E = (C+C.')-diag(diag(C))
issymmetric(E)
ishermitian(E)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Operating on Diagonal Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!