如何检查矩阵在R语言中是否有反转

Ham*_*nik 9 r matrix-inverse

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

因此在R中有一个带矩阵输入的函数,会返回一些像:

" TRUE "(此矩阵具有反转)/" FALSE "(它没有......).

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().


jlh*_*ard 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
Run Code Online (Sandbox Code Playgroud)

  • 这在 R 4.0.0 中不再有效。来自 R News:矩阵对象现在也继承自类“array”,因此,class(diag(1)) 是 c(“matrix”, “array”)。假设 class(matrix_obj)) 的长度为一,这会错误地使代码无效。` 将第一行更改为 `f &lt;- function(m) "matrix" %in% class(try(solve(m),silent=TRUE))` 似乎有效。 (2认同)

小智 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.