chol2inv(chol(x)) 和 solve(x)
chol2inv(chol(x)) and solve(x)
我假设chol2inv(chol(x))
和solve(x)
是两种不同的方法,在所有情况下都得出相同的结论。例如考虑一个矩阵 S
A <- matrix(rnorm(3*3), 3, 3)
S <- t(A) %*% A
以下两个命令将给出相同的结果:
solve(S)
chol2inv(chol(S))
现在考虑 S 的 Cholesky 分解的转置:
L <- t(chol(S))
现在以下两个命令的结果不再相同:
solve(L)
chol2inv(chol(L))
这让我有点吃惊。这是预期的行为吗?
chol
期望(不检查)它的第一个参数 x
是一个对称正定矩阵,并且它只对 x
的上三角部分进行运算。这样,如果L
是一个下三角矩阵,D = diag(diag(L))
是它的对角部分,那么chol(L)
实际上就等价于chol(D)
,而chol2inv(chol(L))
实际上就等价于solve(D)
.
set.seed(141339L)
n <- 3L
S <- crossprod(matrix(rnorm(n * n), n, n))
L <- t(chol(S))
D <- diag(diag(L))
all.equal(chol(L), chol(D)) # TRUE
all.equal(chol2inv(chol(L)), solve(D)) # TRUE
我假设chol2inv(chol(x))
和solve(x)
是两种不同的方法,在所有情况下都得出相同的结论。例如考虑一个矩阵 S
A <- matrix(rnorm(3*3), 3, 3)
S <- t(A) %*% A
以下两个命令将给出相同的结果:
solve(S)
chol2inv(chol(S))
现在考虑 S 的 Cholesky 分解的转置:
L <- t(chol(S))
现在以下两个命令的结果不再相同:
solve(L)
chol2inv(chol(L))
这让我有点吃惊。这是预期的行为吗?
chol
期望(不检查)它的第一个参数 x
是一个对称正定矩阵,并且它只对 x
的上三角部分进行运算。这样,如果L
是一个下三角矩阵,D = diag(diag(L))
是它的对角部分,那么chol(L)
实际上就等价于chol(D)
,而chol2inv(chol(L))
实际上就等价于solve(D)
.
set.seed(141339L)
n <- 3L
S <- crossprod(matrix(rnorm(n * n), n, n))
L <- t(chol(S))
D <- diag(diag(L))
all.equal(chol(L), chol(D)) # TRUE
all.equal(chol2inv(chol(L)), solve(D)) # TRUE