Создание симметричной матрицы в R
У меня есть матрица в R, которая должна быть симметричной, однако из-за точности машины матрица никогда не симметрична (значения отличаются примерно на 10 ^ -16). Поскольку я знаю, что матрица симметрична, я делаю это до сих пор, чтобы обойти проблему:
s.diag = diag(s)
s[lower.tri(s,diag=T)] = 0
s = s + t(s) + diag(s.diag,S)
Есть ли для этого лучшая одна строка?
Ответы
Ответ 1
Действительно ли обходной путь необходим, если значения только отличаются друг от друга?
Кто-то указал, что мой предыдущий ответ был неправильным. Мне нравятся некоторые из них лучше, но поскольку я не могу удалить этот (принятый пользователем, который ушел), вот еще одно решение, использующее пакет micEcon
:
symMatrix(s[upper.tri(s, TRUE)], nrow=nrow(s), byrow=TRUE)
Ответ 2
s<-matrix(1:25,5)
s[lower.tri(s)] = t(s)[lower.tri(s)]
Ответ 3
Вы можете заставить матрицу быть симметричной с помощью функции 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
Ответ 4
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