我想知道在R中是否存在scipy.linalg.cho_solve的对应物。该函数的作用是给出了A的胆汁因子L(A = LL')和b,它解决了原始问题,Ax = b 。 (不是Lx = b)
(因此它与backsolve / forwardsolve不同)
谢谢你, 俊
答案 0 :(得分:4)
我无法想到一个函数会自动为你做这件事,但是如果你有cholesky因子L,通过重建由分解A = LL'定义的A矩阵,很容易在一行中完成:
A=matrix(c(1,1,1,1,5,5,1,5,14),nrow=3)
# Cholesky decomposition A = LL'
L <- chol(A)
# Make some b with known x
x <- c(1,2,3)
b <- A%*%x
# Solve
solve( t(L) %*% L, b)
编辑:请注意,在R中,Cholesky因子的定义与A = L'L有关,这就是为什么你必须先将转置放在求解中。
edit2:在阅读贝茨文章后,我意识到它应该是:
> solve(crossprod(L),b)
[,1]
[1,] 1
[2,] 2
[3,] 3
答案 1 :(得分:3)
如果我理解正确的话,那么Doug Bates在2004年为R News写的article中介绍了其中一些内容(参见本刊第18页)。
相关位是:
ch <- chol(crossprod(X))
chol.sol <- backsolve(ch, forwardsolve(ch, crossprod(X, y),
upper = TRUE, trans = TRUE))
其中X
是预测变量的矩阵。
Doug的文章接着展示了如何使用Matrix包中的功能(R附带)可以非常快速地解决同一系统。
答案 2 :(得分:2)
我意识到这个问题有点老了,但我看到了答案
forwardsolve(L, forwardsolve(L, b), transp=TRUE)
尚未给出。这使用三角形结构,同时保持原始问题。对于较大的矩阵,这应该更快,更准确。值得注意的是,L <- t(chol(A))
自chol
返回上三角矩阵。
A <- matrix(c(1,1,1,1,5,5,1,5,14), nrow=3)
# Cholesky decomposition A = LL'
L <- t(chol(A))
# Make some b with known x
x <- c(1, 2, 3)
b <- A %*% x
# Solve
forwardsolve(L, forwardsolve(L, b), transp=TRUE)
给出答案:
> forwardsolve(L, forwardsolve(L, b), transp=TRUE)
[,1]
[1,] 1
[2,] 2
[3,] 3