matlab

2011-10-09 13 views
5

में मैट्रिक्स रिटर्न 0 से अलग है मुझे एक बहुत बड़ा मैट्रिक्स दिया गया है (मैं मैट्रिक्स के मानों को नहीं बदल सकता) और मुझे एक (covariance) मैट्रिक्स के विपरीत की गणना करने की आवश्यकता है।matlab

कभी कभी मैं त्रुटि कह

Matrix is close to singular or badly scaled. 
    Results may be inaccurate 

इन स्थितियों मुझे लगता है कि det का मान देता है 0.

(एक सहप्रसरण मैट्रिक्स के) उलटा की गणना करने से पहले में मिल रहा मूल्य जाँच करना चाहते हैं det की और इस

covarianceFea=cov(fea_class); 
covdet=det(covarianceFea); 
if(covdet ==0) 
    covdet=covdet+.00001; 
    %calculate the covariance using this new det 
end 

वहाँ किसी भी तरह से नई det का उपयोग करें और फिर इस का उपयोग सहप्रसरण मैट्रिक्स के व्युत्क्रम की गणना करने के लिए है की तरह कुछ कारगर साबित होंगे?

उत्तर

1

ऐसे परिदृश्य में, एक उलटा गणना करना एक बहुत अच्छा विचार नहीं है। तुम सिर्फ यह करना है, तो मैं प्रदर्शन परिशुद्धता बढ़ाने के लिए इस का उपयोग करते हुए सुझाव है:

format long; 

अन्य सुझाव मैट्रिक्स के SVD का उपयोग करके देखें और वहाँ विलक्षण मूल्यों के साथ चारों ओर टिंकर करने के लिए हो सकता है।

A = U∑V' 
inv(A) = V*inv(∑)*U' 

Σ एक विकर्ण मैट्रिक्स जहां विकर्ण प्रविष्टियों में से एक देखेंगे 0. के पास यदि आप एक सन्निकटन के कुछ प्रकार चाहते हैं तो इस नंबर के साथ चारों ओर खेलने की कोशिश है।

+0

Pseudoinverse के लिए PINV समारोह वहाँ – Amro

16

श्वास। एकवचन निर्धारित करने के लिए निर्धारक की गणना पूरी तरह से करने के लिए एक हास्यास्पद बात है। विशेष रूप से एक बड़े मैट्रिक्स के लिए। क्षमा करें, लेकिन यह है। क्यूं कर? हां, कुछ किताबें आपको यह करने के लिए कहती हैं। शायद आपका प्रशिक्षक भी।

विश्लेषणात्मक एकता एक बात है। लेकिन एकवचन के संख्यात्मक दृढ़ संकल्प के बारे में कैसे? जब तक आप एक प्रतीकात्मक उपकरण का उपयोग नहीं कर रहे हैं, MATLAB फ़्लोटिंग पॉइंट अंकगणित का उपयोग करता है। इसका मतलब यह है कि यह संख्याओं को फ्लोटिंग पॉइंट, डबल परिशुद्धता मान के रूप में संग्रहीत करता है। उन संख्याओं की तुलना में परिमाण में छोटे नहीं हो सकता

>> realmin 
ans = 
    2.2251e-308 

(वास्तव में, MATLAB एक सा है कि तुलना में कम हो जाता है, denormalized संख्या है, जो लगभग 1e-323 के लिए नीचे जा सकते हैं के संदर्भ में।) देखें कि जब मैं स्टोर करने के लिए कोशिश उससे छोटी संख्या में, MATLAB सोचता है कि यह शून्य है।

>> A = 1e-323 
A = 
    9.8813e-324 

>> A = 1e-324 
A = 
    0 

बड़े मैट्रिक्स के साथ क्या होता है?

M = eye(1000); 

के बाद से एम एक पहचान मैट्रिक्स है, यह काफी स्पष्ट रूप से गैर विलक्षण है: उदाहरण के लिए, इस मैट्रिक्स विलक्षण है। वास्तव में, det सुझाव देता है कि यह गैर-एकवचन है।

>> det(M) 
ans = 
    1 

लेकिन, कुछ स्थिरता से इसे गुणा करें। क्या यह गैर-एकवचन बनाता है? नहीं!!!!!!!!!!!!!!!!!!!!!!!! बिलकूल नही। लेकिन वैसे भी कोशिश करें।

>>  det(M*0.1) 
ans = 
    0 

हम्म। चीजें अजीब है। MATLAB मुझे बताता है कि निर्धारक शून्य है। लेकिन हम जानते हैं कि निर्धारक 1e-1000 है। अरे हाँ। गोश, 1e-1000 छोटा है, छोटी संख्या से काफी मात्रा में मैंने आपको दिखाया है कि MATLAB डबल के रूप में स्टोर कर सकता है। तो निर्धारक अंडरफ्लो, भले ही यह स्पष्ट रूप से शून्य न हो। क्या मैट्रिक्स एकवचन है? बिलकूल नही। लेकिन क्या डिट का उपयोग यहां विफल रहता है?बेशक यह होगा, और यह पूरी तरह से उम्मीद है।

इसके बजाय, एकवचन के निर्धारण के लिए एक अच्छा उपकरण का उपयोग करें। कंड, या रैंक जैसे टूल का प्रयोग करें। उदाहरण के लिए, क्या हम रैंक को मूर्ख बना सकते हैं?

>> rank(M) 
ans = 
     1000 

>> rank(M*.1) 
ans = 
     1000 

कि रैंक जानता है यह एक पूर्ण रैंक मैट्रिक्स है, कि क्या हम इसे बड़े पैमाने की परवाह किए बिना या नहीं देखें। एम

>> cond(M) 
ans = 
    1 

>> cond(M*.1) 
ans = 
    1 

फ्लोटिंग पॉइंट अंकगणित की दुनिया में आपका स्वागत है। और ओह, वैसे, फ्लोटिंग पॉइंट अंकगणित का उपयोग करके लगभग किसी भी गणना के लिए एक उपकरण के रूप में det के बारे में भूल जाओ। यह लगभग हमेशा एक गरीब पसंद है।

5

वुडचिप्स ने आपको बहुत अच्छा स्पष्टीकरण दिया है कि आपको निर्धारक का उपयोग क्यों नहीं करना चाहिए। यह एक आम गलतफहमी प्रतीत होता है और आपका प्रश्न मैट्रिक्स को बदलने पर किसी अन्य प्रश्न से बहुत संबंधित है: Is there a fast way to invert a matrix in Matlab?, जहां ओपी ने फैसला किया कि क्योंकि उसके मैट्रिक्स का निर्धारक 1 था, यह निश्चित रूप से उलटा था! यहाँ मेरा उत्तर से एक टुकड़ा

बजाय det(A)=1, यह condition number of your matrix कि कैसे सही या स्थिर उलटा हो जाएगा तय है। ध्यान दें कि det(A)=∏i=1:n λi। तो बस λ1=M, λn=1/M और λi≠1,n=1 सेटिंग det(A)=1 देगी। हालांकि, M → ∞, cond(A) = M2 → ∞ और λn → 0 के रूप में, जिसका अर्थ है कि आपका मैट्रिक्स एकवचन के करीब आ रहा है और उलटा गणना करने में बड़ी संख्यात्मक त्रुटियां होंगी।

आप निम्न सरल उदाहरण के साथ MATLAB में इस परीक्षण कर सकते हैं:

A = eye(10); 
A([1 2]) = [1e15 1e-15]; 

%# calculate determinant 
det(A) 
ans = 

    1 

%# calculate condition number 
cond(A) 
ans = 

    1.0000e+30