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.
Non potete controllare se è hermitiana prima, poi guardare gli autovalori? Il controllo dell'ermiticità è semplice. – vsoftco
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. –
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