flip half of matrix over the diagonal to make a symmetric matrix
98 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Shan Chu
il 4 Mag 2016
Commentato: Steven Lord
il 9 Apr 2024
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 Commenti
Jan
il 4 Mag 2016
Tghe solution depends on how the triangular "array" is stored. Are there zeros in the upper right elements?
John D'Errico
il 4 Mag 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.
Risposta accettata
Azzi Abdelmalek
il 4 Mag 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 Commenti
Bill Tubbs
il 28 Mag 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.
Più risposte (4)
Simon Liljestrand
il 29 Set 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
il 15 Feb 2018
Modificato: Stephen23
il 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 Commenti
Jos (10584)
il 15 Feb 2018
for which the answer will be toeplitz
v = 1:5
toeplitz(v)
Tom Davis
il 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
il 9 Apr 2024
Modificato: Rohit Sachdeva
il 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 Commento
Steven Lord
il 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)
Vedere anche
Categorie
Scopri di più su Operating on Diagonal Matrices in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!