forceSymmetric-methods.Rd
Force a square matrix x
to a symmetricMatrix
,
without a symmetry check as it would be applied for as(x,
"symmetricMatrix")
.
forceSymmetric(x, uplo)
any square matrix (of numbers), either “"traditional"”
(matrix
) or inheriting from
Matrix
.
optional string, "U"
or "L"
indicating which
“triangle” half of x
should determine the result. The
default is "U"
unless x
already has a uplo
slot
(i.e., when it is symmetricMatrix
, or
triangularMatrix
), where the default will be
x@uplo
.
a square matrix inheriting from class
symmetricMatrix
.
symmpart
for the symmetric part of a matrix, or
the coercions as(x, <symmetricMatrix class>)
.
## Hilbert matrix
i <- 1:6
h6 <- 1/outer(i - 1L, i, "+")
sd <- sqrt(diag(h6))
hh <- t(h6/sd)/sd # theoretically symmetric
isSymmetric(hh, tol=0) # FALSE; hence
#> [1] FALSE
try( as(hh, "symmetricMatrix") ) # fails, but this works fine:
#> 6 x 6 Matrix of class "dsyMatrix"
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1.0000000 0.8660254 0.7453560 0.6614378 0.6000000 0.5527708
#> [2,] 0.8660254 1.0000000 0.9682458 0.9165151 0.8660254 0.8206518
#> [3,] 0.7453560 0.9682458 1.0000000 0.9860133 0.9583148 0.9270248
#> [4,] 0.6614378 0.9165151 0.9860133 1.0000000 0.9921567 0.9749960
#> [5,] 0.6000000 0.8660254 0.9583148 0.9921567 1.0000000 0.9949874
#> [6,] 0.5527708 0.8206518 0.9270248 0.9749960 0.9949874 1.0000000
H6 <- forceSymmetric(hh)
## result can be pretty surprising:
(M <- Matrix(1:36, 6))
#> 6 x 6 Matrix of class "dgeMatrix"
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1 7 13 19 25 31
#> [2,] 2 8 14 20 26 32
#> [3,] 3 9 15 21 27 33
#> [4,] 4 10 16 22 28 34
#> [5,] 5 11 17 23 29 35
#> [6,] 6 12 18 24 30 36
forceSymmetric(M) # symmetric, hence very different in lower triangle
#> 6 x 6 Matrix of class "dsyMatrix"
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1 7 13 19 25 31
#> [2,] 7 8 14 20 26 32
#> [3,] 13 14 15 21 27 33
#> [4,] 19 20 21 22 28 34
#> [5,] 25 26 27 28 29 35
#> [6,] 31 32 33 34 35 36
(tm <- tril(M))
#> 6 x 6 Matrix of class "dtrMatrix"
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1 . . . . .
#> [2,] 2 8 . . . .
#> [3,] 3 9 15 . . .
#> [4,] 4 10 16 22 . .
#> [5,] 5 11 17 23 29 .
#> [6,] 6 12 18 24 30 36
forceSymmetric(tm)
#> 6 x 6 Matrix of class "dsyMatrix"
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1 2 3 4 5 6
#> [2,] 2 8 9 10 11 12
#> [3,] 3 9 15 16 17 18
#> [4,] 4 10 16 22 23 24
#> [5,] 5 11 17 23 29 30
#> [6,] 6 12 18 24 30 36