如何在R语言中检查矩阵是否具有逆矩阵

12

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

那么在R中是否有一个函数,可以输入一个矩阵并返回以下类似结果:

"TRUE"(该矩阵具有逆矩阵)/ "FALSE"(没有...)。


2
你尝试过查看行列式(使用det函数)吗?你可以编写一个返回布尔值的函数(例如,ifelse(det(M) == 0, FALSE, TRUE))。 - tkmckenzie
@josilber 不错的建议。此外,如果您有关于矩阵的其他信息,Matrix包似乎可能有一些更有效的方法。 - tkmckenzie
非常感谢,我真的忘记了矩阵及其逆矩阵的这个属性 :) - hamsternik
4个回答

13
使用 abs(det(M)) > threshold 作为判断一个矩阵是否可逆的方法是一个非常糟糕的想法。举个例子:考虑矩阵 cI,其中 I 是单位矩阵,c 是一个常数。如果 c = 0.01,I 是10 × 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,表明它是可逆的。 - josliber
我能看到的一个问题是例如 determinant(crossprod(matrix(rnorm(300), 10, 30))),它是有限的(尽管矩阵的秩仅为30中的10)。 - F. Privé

8
您可以尝试使用来自matrixcalc包的is.singular.matrix函数。
安装包的方法如下:
install.packages("matrixcalc")

加载它:

library(matrixcalc)

创建矩阵的方法如下:
mymatrix<-matrix(rnorm(4),2,2)

测试方法:

is.singular.matrix(mymatrix)

如果一个矩阵可逆,它将返回FALSE,如果一个矩阵是奇异的/不可逆的,它将返回TRUE

7

@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

2
这在 R 4.0.0 中不再适用。来自 R News:矩阵对象现在也继承自类“array”,因此例如,class(diag(1))是c("matrix", "array")。这使得错误地假定class(matrix_obj))长度为一的代码无效。将第一行更改为f <- function(m) "matrix" %in% class(try(solve(m),silent=TRUE))似乎可以解决问题。 - Matt Tyers
所以,is.matrix(try(solve(m), silent = TRUE)) - F. Privé
1
is_invertible <- function(X) !inherits(try(solve(X), silent = TRUE), "try-error") 应该适用于各种 R 版本,并且还支持 Matrix 对象,以及其他实现 solve() 方法的任意矩阵类。 - alexpghayes

2
除了评论中@josilber提供的解决方案(即abs(det(M)) > 1e-10),您还可以使用solve(M) %*% M来处理方阵,或在MASS包中使用ginv来获得矩阵的广义逆。为了获得TRUEFALSE,您可以将这些方法与tryCatchany结合使用,如下所示:out <- tryCatch(solve(X) %*% X, error = function(e) e)any(class(out) == "error")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接