Creare una matrice simmetrica in R

Ho una matrice in R che dovrebbe essere simmetrica, tuttavia, a causa della precisione della macchina, la matrice non è mai simmetrica (i valori differiscono di circa 10 ^ -16). Poiché so che la matrice è simmetrica, ho fatto questo finora per aggirare il problema:

s.diag = diag(s) s[lower.tri(s,diag=T)] = 0 s = s + t(s) + diag(s.diag,S) 

C’è un comando di una linea migliore per questo?

La soluzione alternativa è davvero necessaria se i valori differiscono solo di molto?

Qualcuno ha sottolineato che la mia precedente risposta era sbagliata. Mi piacciono di più gli altri, ma dato che non posso cancellare questo (accettato da un utente che è uscito), ecco un’altra soluzione che usa il pacchetto micEcon :

 symMatrix(s[upper.tri(s, TRUE)], nrow=nrow(s), byrow=TRUE) 
 s<-matrix(1:25,5) s[lower.tri(s)] = t(s)[lower.tri(s)] 

Puoi forzare la matrice a essere simmetrica usando la funzione forceSymmetric nel pacchetto Matrix in R:

 library(Matrix) x<-Matrix(rnorm(9), 3) > x 3 x 3 Matrix of class "dgeMatrix" [,1] [,2] [,3] [1,] -1.3484514 -0.4460452 -0.2828216 [2,] 0.7076883 -1.0411563 0.4324291 [3,] -0.4108909 -0.3292247 -0.3076071 A <- forceSymmetric(x) > A 3 x 3 Matrix of class "dsyMatrix" [,1] [,2] [,3] [1,] -1.3484514 -0.4460452 -0.2828216 [2,] -0.4460452 -1.0411563 0.4324291 [3,] -0.2828216 0.4324291 -0.3076071 
  s<-matrix(1:25,5) pmean <- function(x,y) (x+y)/2 s[] <- pmean(s, matrix(s, nrow(s), byrow=TRUE)) s #------- [,1] [,2] [,3] [,4] [,5] [1,] 1 4 7 10 13 [2,] 4 7 10 13 16 [3,] 7 10 13 16 19 [4,] 10 13 16 19 22 [5,] 13 16 19 22 25