R中的三角矩阵的求逆方法是什么?
我有一个上三角矩阵,我想快速计算它的逆矩阵。我尝试了R中的三角矩阵的求逆方法是什么?,r,matrix-inverse,triangular,R,Matrix Inverse,Triangular,我有一个上三角矩阵,我想快速计算它的逆矩阵。我尝试了qr.solve(),但我感觉它相当于solve(),并且它没有利用输入矩阵的三角形特性。最好的方法是什么?似乎solve的执行速度比qr.solve快一些,但是qr.solve更健壮 n <- 50 mymatrix <- matrix(0, nrow=n, ncol=n) fun1 <- function() { for (i in 1:n) { mymatrix[i, i:n] <- rnorm(n-
qr.solve()
,但我感觉它相当于solve()
,并且它没有利用输入矩阵的三角形特性。最好的方法是什么?似乎solve
的执行速度比qr.solve
快一些,但是qr.solve
更健壮
n <- 50
mymatrix <- matrix(0, nrow=n, ncol=n)
fun1 <- function() {
for (i in 1:n) {
mymatrix[i, i:n] <- rnorm(n-i+1)+3
}
solve(mymatrix)
}
fun2 <- function() {
for (i in 1:n) {
mymatrix[i, i:n] <- rnorm(n-i+1)+3
}
qr.solve(mymatrix)
}
> system.time(for (i in 1:1000) fun1())
user system elapsed
1.92 0.03 1.95
> system.time(for (i in 1:1000) fun2())
user system elapsed
2.92 0.00 2.92
尝试backsolve()
,并使用具有适当维度的单位矩阵作为右侧值
library(microbenchmark)
n <- 2000
n.cov <- 1000
X <- matrix(sample(c(0L, 1L), size = n * n.cov, replace = TRUE),
nrow = n, ncol = n.cov)
R <- chol(crossprod(X))
rm(X)
microbenchmark(
backsolve = backsolve(r = R, x = diag(ncol(R))),
solve = solve(R),
times = 10)
Unit: milliseconds
expr min lq mean median uq max neval
backsolve 467.2802 467.5142 469.4457 468.1578 468.6501 482.2431 10
solve 748.2351 748.8318 750.0764 750.3319 750.9583 751.5005 10
库(微基准)
n如果你想得到矩阵的逆矩阵M
,你可以简单地使用backsolve(M,diag(dim(M)[1])
。例如:
M <- matrix(rnorm(100), 10, 10) # random matrix
M[lower.tri(M)] <- 0 # make it triangular
Minv <- backsolve(M, diag(dim(M)[1]))
M%*%Minv
MR基函数chol2inv
可能在做三角矩阵求逆的技巧。将对称正定方阵从其Choleski分解中求逆。等效地,从X的QR分解的(R部分)计算(X'X)^(-1)
。
更一般地说,给定一个上三角矩阵R,计算(R'R)^(-1)
。
看
我用微基准法测试了它的速度:qr.solve最慢,solve排名第三,backsolve排名第二,chol2inv最快
cma最近,我遇到了同样的问题。我的解决方案是加载Matrix包,然后定义以下两个R函数作为该任务的包装器:
my.backsolve <- function(A, ...) solve(triu(A), ...)
my.forwardsolve <- function(A, ...) solve(tril(A), ...)
my.backsolve最好提供一些示例输入和预期输出,以确保愿意提供可能答案的人回答了正确的问题。我认为问题已经足够清楚了。我只是在寻找一个函数名,或者如果找不到它,就找一个算法来高效地计算三角矩阵的逆。qr.solve
和solve
在你似乎暗示的意义上是不等价的。第一个使用QR分解,第二个使用LU分解。你为什么想要一个倒数?如果你想解一个三角形系统,看看backsolve
和forwardsolve
。事实上,我已经用QR分解得到了上三角矩阵R。我只想高效地计算R^-1。这只是一个解矩阵方程的例子,不是矩阵求逆的例子。感谢测试,但我不确定qrsolve是否真的利用了输入矩阵的三角形形式。它必须尝试将其分解为QR形式。尽管如此,还是有一些特定(且快速)的算法被设计来反转这些矩阵。chol2inv(M)
不会返回M
的倒数(即使M
是三角形)
my.backsolve <- function(A, ...) solve(triu(A), ...)
my.forwardsolve <- function(A, ...) solve(tril(A), ...)