Создание симметричной матрицы в R

У меня есть matrix в R, которая должна быть симметричной, однако из-за точности машины matrix никогда не симметрична (значения отличаются примерно на 10 ^ -16). Поскольку я знаю, что matrix симметрична, я делаю это до сих пор, чтобы обойти проблему:

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

Есть ли лучшая одна строка для этого?

Действительно ли обходной путь необходим, если значения только отличаются друг от друга?

Кто-то указал, что мой предыдущий ответ был неправильным. Мне нравятся некоторые из них лучше, но поскольку я не могу удалить этот (принятый пользователем, который ушел), вот еще одно решение, использующее пакет 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)] 

Вы можете заставить матрицу быть симметричной с помощью forceSymmetric функции в пакете Matrix в 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 
Давайте будем гением компьютера.