10

मैंने देखा है कि यदि ए एक एनएक्सएन मैट्रिक्स है और इसमें उलटा मैट्रिक्स है। लेकिन क्या inv() और pinv() फ़ंक्शन आउटपुट अलग है।मैटलैब और ऑक्टेव में inv() और pinv() का आउटपुट बराबर क्यों नहीं है?

A = rand(3,3) 
A = 
0.185987 0.192125 0.046346 
0.140710 0.351007 0.236889 
0.155899 0.107302 0.300623 

pinv(A) == inv(A) 
ans = 
0 0 0 
0 0 0 
0 0 0 
  • यह सब एक ही ans परिणाम चलाकर है: - मेरे माहौल Win7x64 SP1, मैटलैब R2012a, Cygwin सप्टक 3.6.4, FreeMat 4.2

    है सप्टक से उदाहरणों पर एक नज़र है Matlab में ऊपर एक ही आदेश।


  • और मैं inv(A)*A या A*inv(A) गणना, परिणाम दोनों सप्टक और Matlab में पहचान 3x3 मैट्रिक्स है।
  • A*pinv(A) और pinv(A)*A का परिणाम Matlab और FreeMat में पहचान 3x3 मैट्रिक्स हैं।
  • A*pinv(A) का परिणाम ऑक्टेव में पहचान 3x3 मैट्रिक्स है।
  • pinv(A)*A का परिणाम ऑक्टेव में पहचान 3x3 मैट्रिक्स नहीं है।

मैं कारण है कि inv(A) != pinv(A), मैं मैट्रिक्स में तत्व के विवरण पर विचार किया है पता नहीं है। ऐसा लगता है कि फ्लोटिंग सटीकता समस्या है जो इस समस्या का कारण बनती है।

  • 6.65858991579923298331777914427220821380615200000000 तत्व inv(A)(1,1)

    के खिलाफ में
  • 6.65858991579923209513935944414697587490081800000000pinv(A)(1,1)

+0

के संभावित डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/1419580/क्यों-है-matlabs-inv-slow-and -accaccurate) – Shai

+0

@Shai, मेरा मानना ​​है कि ओपी से जुड़े प्रश्न के उत्तर पढ़ने से लाभ हो सकता है (कम से कम यदि ओपी 'inv' का उपयोग कर रहा है 'x = ए^-1 * बी' को हल करना), लेकिन आईएमओ यह एक डुप्लिकेट नहीं है। –

उत्तर

2

में तत्व चल बिन्दु गणित है: डॉट बिंदु के बाद

10+ अंक इस तरह अलग अलग हो सकता है एक निश्चित परिशुद्धता, आप समानता पर भरोसा नहीं कर सकते हैं। ऐसी त्रुटियों से बचने के लिए, आप matlab के प्रतीकात्मक टूलबॉक्स के साथ काम करने का प्रयास कर सकते हैं।

सप्तक में कोड का बहुत ही सरल रेखा समस्याओं प्रदर्शित करने के लिए:

>>> (1/48)*48==(1/49)*49 
ans = 0 
>>> (1/48)*48-(1/49)*49 
ans = 1.1102e-16 
>>> 
7

मुझे ऐसा लगता है जैसे तुम यहाँ नीचे में अपने खुद के सवाल का जवाब दे। कारण अंकगणित बिंदु अंकगणित है। inv() और pinv() के लिए algortihms बिल्कुल समान नहीं हैं, क्योंकि pinv() गैर स्क्वायर मैट्रिक्स को संभालने में सक्षम होना चाहिए। इसलिए जवाब बिल्कुल वही नहीं होंगे।

यदि आप pinv(A)*A के मान को देखते हैं, तो आप देखेंगे कि यह पहचान मैट्रिक्स के बहुत करीब है।

मैं:

ans = 

    1.0000e+00 6.1062e-16 -3.0809e-15 
    -5.8877e-15 1.0000e+00 6.3942e-15 
    2.4425e-15 -3.0184e-16 1.0000e+00 

== साथ मैट्रिक्स की तुलना करने के बजाय, का उपयोग < tolerance_limit

c = A*pinv(A); 
d = pinv(A)*A; 

(c-d) < 1e-10 

Sidenote:

x = A^-1*b हल नहीं किया जाना चाहिए x = inv(A)*b;, बल्कि x = A \ b; देखेंस्पष्टीकरण के लिए।

+0

मेरा मतलब यह था कि पिनव (ए) * ए पहचान मैट्रिक्स होना चाहिए, जबकि अब ऑक्टेव मुझे यह जवाब नहीं दे रहा है, मुझे पता है कि यह छोटा परिणाम क्यों निकलता है, लेकिन क्या हमें हमेशा मैट्रिक्स को उलटा नहीं करना चाहिए मैट्रिक्स पहचान मैट्रिक्स के बराबर है जैसे मैटलैब और फ्रीमैट अब कर रहे हैं? – myme5261314

+0

ऑक्टेव आपको क्या देता है? मुझे लगता है कि परिणाम मैट्रिक्स के लिए हर करीबी_ (मेरे उदाहरण के रूप में)। यह समझने के लिए कि यह क्यों है, डैनियल का जवाब काफी व्याख्यात्मक है। ऑक्टेव पहले मूल मैट्रिक्स के साथ गुणा करने की तुलना में विपरीत की गणना करता है। अगर आपको कुछ अलग मिलता है, तो कृपया एक उदाहरण दें। –

+0

मुझे आपके उत्तर में आपके उत्तर के समान उत्तर मैट्रिक्स मिलता है।मेरा मतलब यह है कि एक उत्पाद के रूप में या लाइब्रेरी के रूप में कहने के लिए, ऑक्टेव को पिनव (ए) * ए = पहचान मैट्रिक्स देना चाहिए जो समझ में आता है, लेकिन अब उत्तर मैट्रिक्स जो इसे वापस लौटाता है, वह समझ में नहीं आता है, और पिनव (ए) * मैटलैब और फ्रीमैट में पहचान मैट्रिक्स के बराबर है। – myme5261314

13

यह प्रश्न काफी पुराना है, लेकिन मैं इसका उत्तर दूंगा क्योंकि यह कुछ Google खोजों में लगभग शीर्ष पर दिखाई देता है।

मैं अपने उदाहरण के लिए जादू (एन) फ़ंक्शन का उपयोग करूंगा जो एन-बाय-एन जादू वर्ग लौटाता है।

मैं एक 3x3 जादू वर्ग एम 3 बनाएंगे, जिसमें Pseudoinverse PI_M3 लेते हैं और उन्हें गुणा करते हैं:

 prompt_$ M3 = magic(3) , PI_M3 = pinv(M3) , M3 * PI_M3
 
    M3 = 

    8 1 6 
    3 5 7 
    4 9 2 

    PI_M3 = 

    0.147222 -0.144444 0.063889 
    -0.061111 0.022222 0.105556 
    -0.019444 0.188889 -0.102778 

    ans = 

    1.0000e+00 -1.2212e-14 6.3283e-15 
    5.5511e-17 1.0000e+00 -2.2204e-16 
    -5.9952e-15 1.2268e-14 1.0000e+00 

आप देख सकते हैं इस सवाल का जवाब पहचान मैट्रिक्स कुछ राउंडिंग त्रुटियों के लिए बचाने के लिए है। मैं एक 4x4 जादू वर्ग के साथ आपरेशन दोहराने की आवश्यकता होगी:

 prompt_$ M4 = magic(4) , PI_M4 = pinv(M4) , M4 * PI_M4
 
    M4 = 

    16 2 3 13 
     5 11 10 8 
     9 7 6 12 
     4 14 15 1 

    PI_M4 = 

    0.1011029 -0.0738971 -0.0613971 0.0636029 
    -0.0363971 0.0386029 0.0261029 0.0011029 
    0.0136029 -0.0113971 -0.0238971 0.0511029 
    -0.0488971 0.0761029 0.0886029 -0.0863971 

    ans = 

    0.950000 -0.150000 0.150000 0.050000 
    -0.150000 0.550000 0.450000 0.150000 
    0.150000 0.450000 0.550000 -0.150000 
    0.050000 0.150000 -0.150000 0.950000 

परिणाम पहचान मैट्रिक्स, इसका मतलब है कि 4x4 जादू वर्ग एक व्युत्क्रम नहीं है नहीं है। मैं मूर-Penrose Pseudoinverse के नियमों में से एक कोशिश कर रहा द्वारा इस की पुष्टि कर सकते हैं:

 prompt_$ M4 * PI_M4 * M4
 
ans = 

    16.00000 2.00000 3.00000 13.00000 
    5.00000 11.00000 10.00000 8.00000 
    9.00000 7.00000 6.00000 12.00000 
    4.00000 14.00000 15.00000 1.00000 

शासन ए * बी * एक = एक संतुष्ट है। इससे पता चलता है कि जब यह उपलब्ध होता है तो पिनव उलटा मैट्रिक्स देता है और जब उलटा उपलब्ध नहीं होता है तो छद्म कनेक्ट होता है। यही कारण है कि कुछ स्थितियों में आपको थोड़ा अंतर मिलता है, बस कुछ गोल करने वाली त्रुटियां होती हैं, और अन्य परिस्थितियों में आपको एक बड़ा अंतर मिलता है। यह दिखाने के लिए मैं दोनों जादू चतुर्थ भाग का उल्टा और उन्हें Pseudoinverse से घटा देंगे: [? क्यों Matlab के निवेश संबंधी निर्णय निर्माताओं धीमी और गलत है]

 prompt_$ I_M3 = inv(M3) , I_M4 = inv(M4) , DIFF_M3 = PI_M3 - I_M3, DIFF_M4 = PI_M4 - I_M4
 
    I_M3 = 

    0.147222 -0.144444 0.063889 
    -0.061111 0.022222 0.105556 
    -0.019444 0.188889 -0.102778 

    warning: inverse: matrix singular to machine precision, rcond = 1.30614e-17 
    I_M4 = 

    9.3825e+13 2.8147e+14 -2.8147e+14 -9.3825e+13 
    2.8147e+14 8.4442e+14 -8.4442e+14 -2.8147e+14 
    -2.8147e+14 -8.4442e+14 8.4442e+14 2.8147e+14 
    -9.3825e+13 -2.8147e+14 2.8147e+14 9.3825e+13 

    DIFF_M3 = 

    4.7184e-16 -1.0270e-15 5.5511e-16 
    -9.9226e-16 2.0470e-15 -1.0825e-15 
    5.2042e-16 -1.0270e-15 4.9960e-16 

    DIFF_M4 = 

    -9.3825e+13 -2.8147e+14 2.8147e+14 9.3825e+13 
    -2.8147e+14 -8.4442e+14 8.4442e+14 2.8147e+14 
    2.8147e+14 8.4442e+14 -8.4442e+14 -2.8147e+14 
    9.3825e+13 2.8147e+14 -2.8147e+14 -9.3825e+13 
संबंधित मुद्दे