2016-02-05 6 views
6

मैं एक वर्णक्रमीय क्लस्टरिंग एल्गोरिदम लागू कर रहा हूं और मुझे यह सुनिश्चित करना है कि एक मैट्रिक्स (लैपलासीन) सकारात्मक अर्ध-निश्चित है।ईजिन - जांचें कि क्या मैट्रिक्स सकारात्मक है (अर्ध-) असीमित

एक जांच अगर मैट्रिक्स सकारात्मक निश्चित (पीडी) पर्याप्त है, क्योंकि "सेमी-" भाग eigenvalues ​​में देखा जा सकता है। मैट्रिक्स बहुत बड़ा है (एनएक्सएन जहां एन कुछ हजारों के क्रम में है) इसलिए ईजेनैनालिसिस महंगा है।

क्या ईजिन में कोई जांच है जो रनटाइम में एक बूल परिणाम देता है?

मैटलैब chol() विधि के साथ परिणाम दे सकता है यदि कोई मैट्रिक्स पीडी नहीं है तो अपवाद फेंक कर। इस विचार के बाद, Eigen LLL.llt().matrixL() की शिकायत किए बिना परिणाम देता है, हालांकि मुझे कुछ चेतावनी/त्रुटि की उम्मीद थी। ईजिन में isPositive विधि भी है, लेकिन bug के कारण यह पुराने ईजिन संस्करण वाले सिस्टम के लिए उपयोग करने योग्य नहीं है।

+0

आप की जाँच नहीं कर सकते अगर यह hermitian पहले है, तो eigenvalues ​​को देखो? विरासत के लिए जांच सरल है। – vsoftco

+0

आप हेर्मेटियन भाग के बारे में सही हैं, लेकिन आदर्श रूप से मैं कई बार एक विशाल मैट्रिक्स के लिए कंप्यूटिंग ईग्नवेल्यूज़ से बचना चाहता हूं, क्योंकि यह मेरा वांछित आउटपुट है इसलिए मैं इसे संभव होने पर बस एक बार ऐसा करना चाहता हूं। –

+0

शायद आप ईजिन से चोलस्की अपघटन का प्रयास कर सकते हैं, और यदि मैट्रिक्स नकारात्मक है, तो यह 'न्यूमेरिकल इश्य्यू' देता है, http://eigen.tuxfamily.org/dox/classEigen_1_1LLT.html – vsoftco

उत्तर

9

आप एक Cholesky अपघटन (LLT) है, जो Eigen::NumericalIssue लौटाता है यदि मैट्रिक्स नकारात्मक है, documentation देखने का उपयोग कर सकते हैं। नीचे

उदाहरण:

#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!"); 
    }  
} 
संबंधित मुद्दे