2016-02-05 17 views
6

Sto implementando un algoritmo di clustering spettrale e devo garantire che una matrice (laplaciana) sia positiva semi-definita.Eigen - Verifica se la matrice è positiva (semi-) Definita

Un controllo se la matrice è definita positiva (PD) è sufficiente, poiché la parte "semi" può essere visto in autovalori. La matrice è piuttosto grande (nxn dove n è nell'ordine di qualche migliaio), quindi l'eigenanalisi è costosa.

C'è qualche controllo in Eigen che dà un risultato bool in runtime?

Matlab può dare un risultato con il metodo chol() lanciando un'eccezione se una matrice non è PD. Seguendo questa idea, Eigen restituisce un risultato senza lamentarsi per LLL.llt().matrixL(), anche se mi aspettavo qualche avvertimento/errore. Eigen ha anche il metodo isPositive, ma a causa di un bug è inutilizzabile per i sistemi con una vecchia versione di Eigen.

+0

Non potete controllare se è hermitiana prima, poi guardare gli autovalori? Il controllo dell'ermiticità è semplice. – vsoftco

+0

Hai ragione riguardo alla parte hermitiana, ma idealmente vorrei evitare di calcolare gli autovalori per un'enorme matrice diverse volte, poiché questa è la mia uscita desiderata, quindi vorrei che succedesse solo una volta se possibile. –

+0

Forse si può provare la decomposizione di Cholesky dalla Eigen, e che restituisce 'NumericalIssue' se la matrice è negativo, vedere http://eigen.tuxfamily.org/dox/classEigen_1_1LLT.html – vsoftco

risposta

9

È possibile utilizzare una scomposizione di Cholesky (LLT), che restituisce Eigen::NumericalIssue se la matrice è negativa, vedere documentation.

Esempio di seguito:

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