Select Page

How to Solve R Error in solve.default() Lapack routine dgesv: system is exactly singular

by | Programming, R, Tips

This error occurs when you try to use the solve() function, but the matrix you handle is a singular matrix. Singular matrices do not have an inverse.

The only way to solve this error is to create a matrix that is not singular.

This tutorial will go through the error and solve it with code examples.


Example

Let’s look at an example to reproduce to error. First, we will create a 3×3 matrix using the matrix() function:

mat <- matrix(c(1, 1, 1, 1, 1, 1, 1, 1, 1), ncol=3, nrow=3)

mat
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

Let’s try to get the inverse of the matrix by using the solve function.

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

The error occurs because mat is a singular matrix. It is not possible to invert a singular matrix. LAPACK is a Linear Algebra package used underneath solve(). DGESV computes the solution to a real system of linear equations A * X = B.

What is a Singular Matrix?

A singular matrix is a square matrix (same number of rows and columns) if its determinant is 0. The inverse of a matrix A is found using the formula A-1 = (adj A) / (det A), where det A is the determinant of A. If det A = 0 then 0 is in the denominator to calculate A-1. Therefore A-1 is not defined when det A = 0.

We can check the determinant of a matrix using the det() function:

det(mat)
0

We can see that the determinant of the matrix is zero, which is why we encountered the error.

Solution

We can solve the error by choosing a matrix that is not singular. The two ways to check if a matrix is singular are if it is a square matrix and its determinant is 0. Let’s look at the revised code:

mat <- matrix(c(1, 3, 3, 4, 12, 6, 7, 2, 9), ncol=3, nrow=3)
mat

Let’s run the code to see the updated matrix:

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    3   12    2
[3,]    3    6    9

Let’s check the determinant of the matrix:

det(mat)
[1] -114

We have a defined determinant for the matrix. Therefore we can find its inverse using the solve() function as follows.

solve(mat)
          [,1]        [,2]       [,3]
[1,] -0.8421053 -0.05263158  0.6666667
[2,]  0.1842105  0.10526316 -0.1666667
[3,]  0.1578947 -0.05263158  0.0000000

Summary

Congratulations on reading to the end of this tutorial!

For further reading on R-related errors, go to the articles: 

Go to the online courses page on R to learn more about coding in R for data science and machine learning.

Have fun and happy researching!