如何确定矩阵在R中是否具有倒数?
在R中有一个函数,通过矩阵输入,会返回像:
那样的东西“ TRUE ”(此矩阵具有反转)/“ FALSE ”(它没有......)。
答案 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
将给出广义矩阵的逆。
要获得TRUE
或FALSE
,您只需将这些方法与tryCatch
和any
合并,就像这样:
out <- tryCatch(solve(X) %*% X, error = function(e) e)
any(class(out) == "error")