250x250 后 R 错误中的大矩阵求逆

Large matrix inversion in R error after 250x250

尝试对大于 250x250 的矩阵执行矩阵求逆时收到以下错误。如果矩阵的大小超过此大小,我只会收到错误。

Error in solve.default(S) : 
  system is computationally singular: reciprocal condition number = 2.10729e-20

我已经尝试过其他比这更大的矩阵进行反转。我已经检查了矩阵中的多重共线性并且有 none。什么可能导致此错误?

编辑:更改公差确实可以防止错误。但是为什么只有当矩阵大于 250x250 时才会抛出错误?

计算大小大于250的矩阵没有问题:

set.seed(12345)
N = 300
m <- matrix(rnorm(N*N), nrow = N)
str(m)
# num [1:300, 1:300] 0.586 0.709 -0.109 -0.453 0.606 ...

m.inv <- solve(m)
str(m.inv)
# num [1:300, 1:300] 0.0274 -0.0164 0.0384 -0.0936 -0.1086 ...

但是如果矩阵的行列式为0(或者几乎为0),那么显然求逆会出错:

p <- matrix(7, nrow = N, ncol=N)
str(p)
# num [1:300, 1:300] 7 7 7 7 7 7 7 7 7 7 ...

p.inv <- solve(p)
#Error in solve.default(p) : 
#  Lapack routine dgesv: system is exactly singular: U[2,2] = 0

在您的情况下,您似乎在使用非常小的值进行操作。尝试指定更小的公差:

solve(..., tol = 1e-17)

# You can check the current tollerance on your system:
.Machine$double.eps
#[1] 2.220446e-16

一个更好的方法可能是先计算行列式,然后处理它非常小的情况:

det(p)
#[1] 0

为了回答您的问题为什么只有当您的矩阵大于 250 个元素时才会出现错误,我建议您计算 250x250 矩阵的行列式,然后计算更大矩阵的行列式并比较值。第二个值可能小于公差,而第一个不是。