R中矩阵逆的有效计算


21

我需要计算矩阵逆,并且一直在使用solve函数。尽管在小型矩阵上效果很好,但solve在大型矩阵上往往非常慢。我想知道是否还有其他功能或功能组合(通过SVD,QR,LU或其他分解功能)可以使我更快地得到结果。


2
您能否提供更多信息?大概尺寸是多少?矩阵是否具有任何特殊结构(对称性,稀疏性等)?您对“慢速”的定量定义是什么?和“快速”?
主教

近似尺寸约为2000x2000。矩阵没有任何特殊结构。好吧,solve方法肯定可以完成我的工作,但是我希望算法更快。因此,我只是想知道是否有一个更有效的(在时间范围内)函数来计算如此大尺寸矩阵的逆。
jitendra 2011年

1
您是否尝试过帮助页面上的其他建议solve?当然,如果没有特殊的结构,您将无法摆脱一般矩阵求逆的理论复杂性界限。
主教

3
@Cardinal诀窍是进一步探究实际应用,因为您知道,在许多情况下,无需对矩阵求逆(这既费时又容易出错)。
ub

@whuber:这是非常好的一点。我想有时候我会直接解决这些问题。
主教

Answers:


23

您是否尝试过枢机主教的建议,并探索了一些计算逆函数的替代方法?让我们考虑一个具体的例子:

library(MASS)

k   <- 2000
rho <- .3

S       <- matrix(rep(rho, k*k), nrow=k)
diag(S) <- 1

dat <- mvrnorm(10000, mu=rep(0,k), Sigma=S) ### be patient!

R <- cor(dat)

system.time(RI1 <- solve(R))
system.time(RI2 <- chol2inv(chol(R)))
system.time(RI3 <- qr.solve(R))

all.equal(RI1, RI2)
all.equal(RI1, RI3)

因此,这是我们要求逆的 x相关矩阵的示例。在我的笔记本电脑(Core-i5 2.50Ghz)上,需要8-9秒,4秒多一点时间和17-18秒(建议运行多次代码以获得稳定的结果)。2000×2000solvechol2inv(chol())qr.solve()

因此通过Choleski分解的逆大约是速度的两倍solve。当然,可能会有更快的方法。我只是在这里探讨了一些最明显的方法。就像评论中已经提到的那样,如果矩阵具有特殊的结构,则可以利用它来提高速度。


非常感谢您提供此解决方案。我,至少,知道一个方法可以解决它一半的时间相比,solve:-)
jitendra

8
对于协方差/相关矩阵,Cholesky分解是一个不错的选择,但请记住,通常矩阵必须是Hermitian(对于实数矩阵,这意味着对称),正定矩阵。这将占用LU分解所需的一半内存。
拉克塞尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.