如何确定矩阵在R中是否有逆矩阵?
那么在R中是否有一个函数,可以输入一个矩阵并返回以下类似结果:
"TRUE"(该矩阵具有逆矩阵)/ "FALSE"(没有...)。
如何确定矩阵在R中是否有逆矩阵?
那么在R中是否有一个函数,可以输入一个矩阵并返回以下类似结果:
"TRUE"(该矩阵具有逆矩阵)/ "FALSE"(没有...)。
abs(det(M)) > threshold
作为判断一个矩阵是否可逆的方法是一个非常糟糕的想法。举个例子:考虑矩阵 cI,其中 I 是单位矩阵,c 是一个常数。如果 c = 0.01,I 是10 × 10,则 det(cI) = 10^-20,但 (cI)^-1 一定存在,并且简单地等于 100I。如果 c 足够小,det()
将下溢并返回 0,即使矩阵是可逆的。如果您想使用行列式检查可逆性,请检查对数行列式的模是否有限,使用 determinant()
。M <- 1e-5 * diag(100)
(明显可逆),det(M)
返回0(暗示它不可逆),但是determinant(M)$modulus
返回-1151.293,表明它是可逆的。 - josliberdeterminant(crossprod(matrix(rnorm(300), 10, 30)))
,它是有限的(尽管矩阵的秩仅为30中的10)。 - F. Privématrixcalc
包的is.singular.matrix
函数。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
矩阵对象现在也继承自类“array”,因此例如,class(diag(1))是c("matrix", "array")。这使得错误地假定class(matrix_obj))长度为一的代码无效。
将第一行更改为f <- function(m) "matrix" %in% class(try(solve(m),silent=TRUE))
似乎可以解决问题。 - Matt Tyersis.matrix(try(solve(m), silent = TRUE))
。 - F. PrivéMatrix
对象,以及其他实现 solve()
方法的任意矩阵类。 - alexpghayesabs(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")
。
det
函数)吗?你可以编写一个返回布尔值的函数(例如,ifelse(det(M) == 0, FALSE, TRUE)
)。 - tkmckenzieMatrix
包似乎可能有一些更有效的方法。 - tkmckenzie