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

时间:2014-07-25 18:09:53

标签: r matrix-inverse

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

在R中有一个函数,通过矩阵输入,会返回像:

那样的东西
  

TRUE ”(此矩阵具有反转)/“ FALSE ”(它没有......)。

4 个答案:

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

答案 1 :(得分:7)

您可以尝试使用double slope = (double)(endY - startY) / (endX - startX); //adjustable resolution factor double resolution = 1; double x = startX; while (x <= endX) { double y = slope * (x - startX) + startY; drawPixel(x, y); x += resolution; } 包中的is.singular.matrix功能。

安装包:

matrixcalc

加载它:

install.packages("matrixcalc")

创建矩阵:

library(matrixcalc)

测试它:

mymatrix<-matrix(rnorm(4),2,2)

如果矩阵是可逆的,则返回is.singular.matrix(mymatrix) ,如果矩阵是单一/不可逆的,则返回FALSE

答案 2 :(得分:6)

@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

答案 3 :(得分:2)

除了@josilber在评论中提供的解决方案(即abs(det(M)) > 1e-10)之外,您还可以使用solve(M) %*% M作为方形矩阵,或者在MASS包中ginv将给出广义矩阵的逆。

要获得TRUEFALSE,您只需将这些方法与tryCatchany合并,就像这样:

out <- tryCatch(solve(X) %*% X, error = function(e) e)

any(class(out) == "error")