MAB*_*MAB 12
使用abs(det(M)) > threshold作为确定矩阵是否可逆的方法是一个非常糟糕的想法.这是一个例子:考虑矩阵的类cI,其中I是单位矩阵,c是常数.如果c = 0.01且I是10×10,那么det(cI)= 10 ^ -20,但是(cI)^ - 1绝对存在并且仅为100I.如果c足够小,det()即使矩阵是可逆的,也会下溢并返回0.如果要使用行列式来检查可逆性,请检查对数行列式的模数是否是有限的determinant().
@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
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以尝试使用包中的is.singular.matrix功能matrixcalc.
要安装包:
install.packages("matrixcalc")
Run Code Online (Sandbox Code Playgroud)
要加载它:
library(matrixcalc)
Run Code Online (Sandbox Code Playgroud)
要创建矩阵:
mymatrix<-matrix(rnorm(4),2,2)
Run Code Online (Sandbox Code Playgroud)
测试它:
is.singular.matrix(mymatrix)
Run Code Online (Sandbox Code Playgroud)
如果矩阵是可逆的,则返回FALSE,如果矩阵是单一/不可逆的,则返回TRUE.