如何在R中修复:系统正好是单数的错误

1,449 阅读1分钟

你在R中可能遇到的一个错误是:

Lapack routine dgesv: system is exactly singular: U[2,2] = 0

当你试图使用solve()函数,但你所处理的矩阵是一个没有矩阵逆的奇异矩阵时,就会出现这个错误。

本教程分享如何在实践中解决这个错误。

如何重现该错误

假设我们在R中创建了以下矩阵:

#create singular matrix
mat <- matrix(c(1, 1, 1, 1), ncol=2, nrow=2)

#view matrix
mat

     [,1] [,2]
[1,]    1    1
[2,]    1    1

现在假设我们试图使用solve()函数来计算矩阵的逆值:

#attempt to invert matrix
solve(mat)

Error in solve.default(mat) : 
  Lapack routine dgesv: system is exactly singular: U[2,2] = 0

我们收到了一个错误,因为我们创建的矩阵没有一个逆矩阵。

注意:看看Wolfram MathWorld的这个页面,它显示了10个没有逆矩阵的矩阵的不同例子。

根据定义,如果一个矩阵的行列式为零,它就是奇异的。

你可以使用det()函数来计算一个给定矩阵的行列式,然后再尝试反转它:

#calculate determinant of matrix
det(mat)

[1] 0

我们矩阵的行列式是零,这就解释了为什么我们会遇到一个错误。

如何修复这个错误

解决这个错误的唯一方法是简单地创建一个非奇异的矩阵。

例如,假设我们在R语言中使用solve()函数来反转以下矩阵:

#create matrix that is not singular
mat <- matrix(c(1, 7, 4, 2), ncol=2, nrow=2)

#view matrix
mat

     [,1] [,2]
[1,]    1    4
[2,]    7    2

#calculate determinant of matrix
det(mat)

[1] -26

#invert matrix
solve(mat)

            [,1]        [,2]
[1,] -0.07692308  0.15384615
[2,]  0.26923077 -0.03846154

我们在反转矩阵时不会收到任何错误,因为该矩阵不是奇异的。

其他资源

下面的教程解释了如何修复R中的其他常见错误:

如何修复:条件的长度>1,并且只使用第一个元素
如何修复:二进制运算符的非数字参数
如何修复:dim(X)必须有一个正的长度
如何修复:选择未使用参数的错误