Search code examples
c++eigeneigen3

Eigen - Check if matrix is Positive (Semi-)Definite


I'm implementing a spectral clustering algorithm and I have to ensure that a matrix (laplacian) is positive semi-definite.

A check if the matrix is positive definite (PD) is enough, since the "semi-" part can be seen in the eigenvalues. The matrix is pretty big (nxn where n is in the order of some thousands) so eigenanalysis is expensive.

Is there any check in Eigen that gives a bool result in runtime?

Matlab can give a result with the chol() method by throwing an exception if a matrix is not PD. Following this idea, Eigen returns a result without complaining for LLL.llt().matrixL(), although I was expecting some warning/error. Eigen also has the method isPositive, but due to a bug it is unusable for systems with an old Eigen version.


Solution

  • You can use a Cholesky decomposition (LLT), which returns Eigen::NumericalIssue if the matrix is negative, see the documentation.

    Example below:

    #include <Eigen/Dense>
    
    #include <iostream>
    #include <stdexcept>
    
    int main()
    {
        Eigen::MatrixXd A(2, 2);
        A << 1, 0 , 0, -1; // non semi-positive definitie matrix
        std::cout << "The matrix A is" << std::endl << A << std::endl;
        Eigen::LLT<Eigen::MatrixXd> lltOfA(A); // compute the Cholesky decomposition of A
        if(lltOfA.info() == Eigen::NumericalIssue)
        {
            throw std::runtime_error("Possibly non semi-positive definitie matrix!");
        }    
    }