如何确定矩阵 R 中是否有逆矩阵?
R 中是否有一个带有矩阵输入的函数,将返回类似以下内容:
“TRUE”(该矩阵有逆矩阵)/“FALSE”(它没有...)。
使用
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()
检查对数行列式的模是否有限。
您可以尝试使用
is.singular.matrix
包中的 matrixcalc
函数。
安装包:
install.packages("matrixcalc")
加载它:
library(matrixcalc)
创建矩阵:
mymatrix<-matrix(rnorm(4),2,2)
测试一下:
is.singular.matrix(mymatrix)
如果矩阵可逆,则返回
FALSE
,如果矩阵是单一/不可逆,则返回 TRUE
。
@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
除了 @josilber 在评论中给出的解决方案(即
abs(det(M)) > 1e-10
)之外,您还可以使用 solve(M) %*% M
表示方阵,或者使用 MASS 包中的 ginv
给出矩阵的广义逆。
要获得
TRUE
或 FALSE
,您可以简单地将这些方法中的任何一种与 tryCatch
和 any
结合起来,如下所示:
out <- tryCatch(solve(X) %*% X, error = function(e) e)
any(class(out) == "error")
使用
is.singular.matrix
包(版本 1.0.6)中的 matrixcalc
函数时可能需要注意一些@Akki 的答案中提到的。
library(gtools)
library(Matrix)
# define a compositional matrix consisting of 10 observations and 8 components
set.seed(2024)
x = rdirichlet(10, alpha = rep(1,8))
y = t(x) %*% x
> rankMatrix(y)
[1] 8
attr(,"method")
[1] "tolNorm2"
attr(,"useGrad")
[1] FALSE
attr(,"tol")
[1] 1.776357e-15
> nrow(y)
[1] 8
> is.singular.matrix(y)
[1] TRUE
y
的秩等于y
的行数,表明y
是满秩矩阵。另外,solve(y)
也给出了答案。但 is.singular.matrix(y)
返回值 TRUE
表明 y
是奇异矩阵