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

问题描述 投票:0回答:5

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

R 中是否有一个带有矩阵输入的函数,将返回类似以下内容:

TRUE”(该矩阵有逆矩阵)/“FALSE”(它没有...)。

r matrix-inverse
5个回答
13
投票

使用

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()
检查对数行列式的模是否有限。


8
投票

您可以尝试使用

is.singular.matrix
包中的
matrixcalc
函数。

安装包:

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
投票

除了 @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")


0
投票

使用

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
是奇异矩阵

© www.soinside.com 2019 - 2024. All rights reserved.