flip half of matrix over the diagonal to make a symmetric matrix
112 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaires
Jan
le 4 Mai 2016
Tghe solution depends on how the triangular "array" is stored. Are there zeros in the upper right elements?
John D'Errico
le 4 Mai 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.
Réponse acceptée
Azzi Abdelmalek
le 4 Mai 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 commentaires
Bill Tubbs
le 28 Mai 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.
Plus de réponses (4)
Simon Liljestrand
le 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
le 15 Fév 2018
Modifié(e) : Stephen23
le 15 Fév 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 commentaires
Jos (10584)
le 15 Fév 2018
for which the answer will be toeplitz
v = 1:5
toeplitz(v)
Tom Davis
le 15 Fév 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
le 9 Avr 2024
Modifié(e) : Rohit Sachdeva
le 9 Avr 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 commentaire
Steven Lord
le 9 Avr 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)
Voir également
Catégories
En savoir plus sur Operating on Diagonal Matrices dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!