flip half of matrix over the diagonal to make a symmetric matrix
112 views (last 30 days)
Show older comments
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 Comments
Jan
on 4 May 2016
Tghe solution depends on how the triangular "array" is stored. Are there zeros in the upper right elements?
John D'Errico
on 4 May 2016
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.
Accepted Answer
Azzi Abdelmalek
on 4 May 2016
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 Comments
Bill Tubbs
on 28 May 2020
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.
More Answers (4)
Simon Liljestrand
on 29 Sep 2017
A=[1 0 0 0
2 3 0 0
4 5 6 0
7 8 9 10];
B=A'+triu(A',1)';
Ben McSeveney
on 15 Feb 2018
Edited: Stephen23
on 15 Feb 2018
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 Comments
Jos (10584)
on 15 Feb 2018
for which the answer will be toeplitz
v = 1:5
toeplitz(v)
Tom Davis
on 15 Feb 2018
[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
on 9 Apr 2024
Edited: Rohit Sachdeva
on 9 Apr 2024
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 Comment
Steven Lord
on 9 Apr 2024
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)
See Also
Categories
Find more on Operating on Diagonal Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!