R中的scipy.linalg.cho_solve对应?

时间:2010-11-09 20:37:55

标签: r scipy

我想知道在R中是否存在scipy.linalg.cho_solve的对应物。该函数的作用是给出了A的胆汁因子L(A = LL')和b,它解决了原始问题,Ax = b 。 (不是Lx = b)

(因此它与backsolve / forwardsolve不同)

谢谢你, 俊

3 个答案:

答案 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