Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的三角矩阵的求逆方法是什么?_R_Matrix Inverse_Triangular - Fatal编程技术网

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), ...)