尝试对大于 250x250 的矩阵执行矩阵反转时收到以下错误。仅当矩阵的大小超过此大小时,我才会收到错误。
Error in solve.default(S) :
system is computationally singular: reciprocal condition number = 2.10729e-20
我尝试过其他比这更大的矩阵,这些矩阵会反转。我已经检查了矩阵中的多重共线性,但没有。什么可能导致此错误?
编辑:更改公差确实可以防止错误。但是,为什么只有在矩阵大于 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(或几乎为零(,那么显然计算逆数时会出现误差:
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 矩阵的行列式,然后计算较大矩阵的行列式并比较值。第二个值可能小于容差,而第一个值则不然。