2016-02-05 6 views
6

Ich implementiere einen spektralen Clustering-Algorithmus und ich muss sicherstellen, dass eine Matrix (Laplace) positiv semi-definit ist.Eigen - Überprüfen, ob die Matrix positiv ist (Semi-) Definite

Eine Überprüfung ob die Matrix positiv definit ist (PD) ist ausreichend, da der "Semi-" Teil in den Eigenwerten zu sehen ist. Die Matrix ist ziemlich groß (nxn, wobei n in der Größenordnung von einigen Tausend liegt), so dass Eigenanalyse teuer ist.

Gibt es einen Check in Eigen, der in der Laufzeit ein bool Ergebnis liefert?

Matlab kann ein Ergebnis mit der chol() Methode geben, indem eine Ausnahme ausgelöst wird, wenn eine Matrix nicht PD ist. Nach dieser Idee gibt Eigen ein Ergebnis zurück, ohne sich über LLL.llt().matrixL() zu beschweren, obwohl ich eine Warnung/einen Fehler erwartet habe. Eigen hat auch die Methode isPositive, aber aufgrund einer bug ist es unbrauchbar für Systeme mit einer alten Eigen-Version.

+0

Können Sie nicht, wenn es hermitesches zuerst, dann Blick auf die Eigenwerte? Die Überprüfung auf Hermitizität ist einfach. – vsoftco

+0

Sie haben recht mit dem hermiteschen Teil, aber im Idealfall möchte ich es vermeiden, Eigenwerte für eine riesige Matrix mehrere Male zu berechnen, da dies meine gewünschte Ausgabe ist, also möchte ich, dass dies nur einmal geschieht, wenn möglich. –

+0

Vielleicht können Sie Cholesky Dekomposition von Eigen versuchen, und das gibt 'NumericalIssue' zurück, wenn die Matrix negativ ist, siehe http://eigen.tuxfamily.org/dox/classEigen_1_1LLT.html – vsoftco

Antwort

9

Sie können eine Cholesky-Zerlegung (LLT) verwenden, die Eigen::NumericalIssue zurückgibt, wenn die Matrix negativ ist, siehe documentation.

Beispiel unten:

#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!"); 
    }  
}