【问题标题】:How to check if a matrix has an inverse in the R language如何在R语言中检查矩阵是否有逆矩阵
【发布时间】:2014-07-25 18:09:52
【问题描述】:

如何确定矩阵在 R 中是否存在逆矩阵?

那么在 R 中是否有一个带有矩阵输入的函数,将返回如下内容:

"TRUE"(这个矩阵有逆矩阵)/"FALSE"(它没有...)。

【问题讨论】:

  • 您是否尝试过查看行列式(使用det 函数)?您可以创建一个返回布尔值的函数(例如,ifelse(det(M) == 0, FALSE, TRUE))。
  • @josilber 好电话。此外,如果您有关于相关矩阵的其他信息,看起来Matrix 包可能有一些更有效的方法。
  • 非常感谢,我真的忘记了矩阵的这个属性及其iverse :)

标签: r matrix-inverse


【解决方案1】:

使用abs(det(M)) > threshold 来确定矩阵是否可逆是一个非常糟糕的主意。这是一个例子:考虑矩阵类 cI,其中 I 是单位矩阵,c 是常数。如果 c = 0.01 且 I 为 10 x 10,则 det(cI) = 10^-20,但 (cI)^-1 绝对存在并且只是 100I。如果 c 足够小,det() 将下溢并返回 0,即使矩阵是可逆的。如果您想使用行列式检查可逆性,请改为使用determinant() 检查对数行列式的模是否有限。

【讨论】:

  • +1。这似乎是目前发布的最好的方法——M <- 1e-5 * diag(100)(显然是可逆的),det(M) 返回 0(暗示它不可逆)但 determinant(M)$modulus 返回 -1151.293,暗示它是可逆的。
  • 我可以看到一个问题,例如determinant(crossprod(matrix(rnorm(300), 10, 30))),这是有限的(尽管矩阵在 30 中只有 10 位)。
【解决方案2】:

您可以尝试使用matrixcalc 包中的is.singular.matrix 函数。

安装包:

install.packages("matrixcalc")

要加载它:

library(matrixcalc)

创建矩阵:

mymatrix<-matrix(rnorm(4),2,2)

测试它:

is.singular.matrix(mymatrix)

如果矩阵是可逆的,则返回FALSE,如果矩阵是单数/不可逆的,则返回TRUE

【讨论】:

    【解决方案3】:

    @MAB 有一个很好的观点。这使用solve(...) 来确定矩阵是否可逆。

    f <- function(m) class(try(solve(m),silent=T))=="matrix"
    x <- matrix(rep(1,25),nc=5)          # singular
    y <- matrix(1+1e-10*rnorm(25),nc=5)  # very nearly singular matrix
    z <- 0.001*diag(1,5)                 # non-singular, but very smalll determinant
    f(x)
    # [1] FALSE
    f(y)
    # [1] TRUE
    f(z)
    # [1] TRUE
    

    【讨论】:

    • 这不再适用于 R 4.0.0。来自 R News:` 矩阵对象现在也继承自类“array”,例如,class(diag(1)) 是 c("matrix", "array")。假设 class(matrix_obj)) 的长度为 1,这会错误地使代码无效。 ` 将第一行更改为f &lt;- function(m) "matrix" %in% class(try(solve(m),silent=TRUE)) 似乎可行。
    • 所以,is.matrix(try(solve(m), silent = TRUE))
    【解决方案4】:

    除了 cmets 中@josilber 给出的解决方案(即abs(det(M)) &gt; 1e-10)之外,您还可以将solve(M) %*% M 用于方阵或在MASS 包中使用ginv 将给出矩阵的广义逆。

    要获得TRUEFALSE,您可以简单地将这些方法中的任何一个与tryCatchany 结合起来,如下所示:

    out &lt;- tryCatch(solve(X) %*% X, error = function(e) e)

    any(class(out) == "error")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多