Matlab [Q, R, E] = qr (A) के पीछे संगत LAPACK फ़ंक्शन क्या है?


12

मैं वर्तमान में मैट्रिक्स लिए एक अच्छे रैंक के अनुमान को सस्ते में गणना करने की कोशिश कर रहा हूं । इसलिए मैं एक स्तंभ का उपयोग करते हुए क्यूआर डीकंपोस्टियन की गणना करता हूंA

[Q,R,E]=qr(A)

मतलाब में मैं का उपयोग करते हुए रैंक का अनुमान लगाता हूंA

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

यह ठीक काम करता है और R की सभी विकर्ण प्रविष्टियों पर एक प्लॉट दिखता है: साजिश (प्रकार (पेट (diag (आर)), 1, 'पतित'), 'आर *')

यदि पूरे एल्गोरिथ्म को C / फोरट्रान I में बदल दिया जाता है, तो LGEACK से DGEQP3 का उपयोग करते हुए [Q, R, E] = qr (A) को प्रतिस्थापित किया जाता है, जो एक स्तंभ को क्यूआर अपघटन की गणना करता है। लेकिन अगर मैं रैंक के लिए एक ही अनुमान का उपयोग करता हूं तो मुझे ज्यादातर कुछ गलत लगता है। DGEQP3 से उत्पादित लिए एक ही प्लॉट जैसा दिखता है R

इनपुट मैट्रिक्स दोनों प्रयोगों के लिए बिल्कुल समान है।

मेरा सवाल अब यह है कि मैटलैब से स्तंभ अपवाहित क्यूआर अपघटन पर लैपैक फ़ंक्शन किस पर निर्भर करता है?

किसी भी मदद के लिए धन्यवाद, Grisu

संपादित करें: DGEQPF एक ही गलत परिणाम देता है।

EDIT2:

  • इनपुट मैट्रिक्स घना है और रूप में निर्मित होता है।E + s i g n ( E , F )AE+sign(E,F)
  • A यहाँ उपलब्ध है: http://www-e.uni-magdeburg.de/makoehle/A.mtx.gz (मैट्रिक्स मैट्रिक्स प्रारूप)
  • गलत : http://www-e.uni-magdeburg.de/makoehle/R_wrong.mtx.gzR
  • मैंने OpenBlas / GotoBLAS (64 बिट) के साथ LAPACK 3.4.0 का उपयोग किया
  • मतलाब 7, 2007 बी, 2010 बी लिनक्स 32 बिट

Edit3: - GDB का उपयोग करके मुझे पता चला, कि Matlab 2010 ने DGEQP3: # 3 0xaa46ce2f को dgeqp3_ () से /usr/ubuntu10.04/matlabr2010.b/bin/glnx86/..///bin/glnx86/// पर कॉल किया। ./bin/glnx86/mllapack.so मुझे LAPACK (3.4.0 वर्किंग नोट 176 में उल्लिखित फ़िक्स का उपयोग करके गलत परिणाम) क्यों प्राप्त होता है?


क्या आप एक छोटे मैट्रिक्स के साथ वही व्यवहार उकसा सकते हैं जिसे आप यहां साझा करने में सक्षम हो सकते हैं?
GertVdE

क्या की कोई विशेष संरचना है? मैं कहना चाहता हूं कि MATLAB विरल रैखिक बीजगणित के लिए UMFPACK का उपयोग करता है, लेकिन मुझे यकीन नहीं है कि अंतर्निहित घने रेखीय बीजगणित पुस्तकालय क्या हैं। A
एरन अहमदिया

है विरल? आप ">> spparms ('स्पुमोनी', 1)" सेट कर सकते हैं और देख सकते हैं कि "स्वीटसर्सेक्यूआर" नामक चीज का इस्तेमाल उस मामले में मैटलैब द्वारा किया जाता है। A
प्रात:

ग्रिसू - मुझे आपके मैट्रिक्स को देखना अच्छा लगेगा। हालाँकि, लिंक www-e.uni-magdeburg.de/makoehle/A.mtx.gz अब सक्रिय नहीं है (वर्तमान समय में, वैसे भी)। क्या आपके पास मैट्रिक्स के लिए एक वर्तमान लिंक है? धन्यवाद, लेस फोस्टर

@LeslieFoster - scicomp में आपका स्वागत है!
एरॉन अहमदिया

जवाबों:


7

यहां दो मुद्दे हैं:

  • है घने या विरल?A
  • क्या आपके पास MATLAB के आंतरिक पुस्तकालयों के समान सॉफ्टवेयर स्टैक है?

सघन या विरल?

MATLAB नहीं रह गया है स्पष्ट रूप से LAPACK दिनचर्या यह एक QR गुणन प्राप्त करने के लिए करता है, तो कॉल का उल्लेख है घना है। यदि MATLAB R2008b के लिए प्रलेखन में जानकारी बाद के रिलीज के लिए भी है, तो जब आप कॉल करते हैं तो MATLAB LAPACK से कॉल करता है । यदि विरल है, तो MATLAB , सूट डेस्पर्सक्यूआर को टिम डेविस के समूह से बाहर कर देता है, जो सूटस्पर्स लाइब्रेरी में UMFPACK के साथ बंडल है।ADGEQP3[Q,R,E] = qr(A)A

क्या आपके पास MATLAB के आंतरिक पुस्तकालयों के समान सॉफ्टवेयर स्टैक है?

शायद नहीं, जो एक कारण हो सकता है कि आप अलग परिणाम प्राप्त कर रहे हैं।

मैं इस मुद्दे पर भाग गया जब एक पुस्तकालय का परीक्षण करने वाली इकाई मैं लिख रहा था कि क्यूआर कारक का उपयोग किया गया था। मैंने अपने काम को प्रोटोटाइप बनाने के लिए MATLAB का उपयोग किया और LAPACK या NumPy का उपयोग करने की तुलना में अलग-अलग परिणाम प्राप्त किए। जहां तक ​​मैं बता सकता हूं, क्योंकि मैथवर्क्स इस जानकारी को खोजने में आसान नहीं बनाता है, MATLAB संस्करण 3.1.1 से पहले पहले LAPACK के एक verson का उपयोग करता है, और इंटेल का MKL BLAS पुस्तकालय (विंडोज, इंटेल मैक और लिनक्स के लिए) संस्करण 9.1 के साथ या उच्चतर ( यहां देखें )। मुझे सुइटशेयर MATLAB के संस्करण के बारे में कुछ भी नहीं मिला। ऑनलाइन के आसपास खुदाई करने या अपने सिस्टम के लिए लाइब्रेरी फ़ाइलों को देखने से, आप अतिरिक्त जानकारी को चमकाने में सक्षम हो सकते हैं। आप उन पुस्तकालयों को बदलने की कोशिश कर सकते हैं जो MATLAB लिंक करते हैं ताकि सॉफ्टवेयर पैकेजों में समान पुस्तकालयों के साथ तुलना करने में सक्षम हो सकें; एरिक चू एक अच्छा लेखन प्रदान करता हैयह दर्शाता है कि आप कम से कम MATLAB की BLAS लाइब्रेरी को अपने साथ कैसे बदल सकते हैं (निश्चित रूप से, आप अपने जोखिम पर ऐसा करते हैं)। वह सुझाव देता है कि आप LAPACK के साथ भी यही काम कर सकते हैं। यह भी संभव हो सकता है कि सुइटसर्से के संस्करण को बदलना जो MATLAB आपके स्वयं के संस्करण के साथ उपयोग करता है।

LAPACK संस्करण बदलते हैं, और इसलिए BLAS संस्करण करते हैं; वे वर्जन से वर्जन तक अलग-अलग एल्गोरिदम या अलग-अलग ऑर्डरिंग कंवेंशन का उपयोग कर सकते हैं, भले ही साथ ऑर्थोगोनल और साथ वर्जन की परवाह किए बिना ऊपरी त्रिकोणीय हो। ये परिवर्तन प्रजनन को एक चुनौती बनाते हैं। यहां तक ​​कि आपके संख्यात्मक रैंक निर्धारण के लिए आपके द्वारा उपयोग की जाने वाली सहिष्णुता एक निर्णय कॉल है; आप एक मानक सहिष्णुता का उपयोग करते हुए दिखाई देते हैं।क्यू आरA=QRQR

मैंने क्यूआर फ़ैक्टराइजेशन के लिए अपने परिणामों को प्रोटोटाइप करने के लिए NumPy का उपयोग करना समाप्त कर दिया, क्योंकि यह सिस्टम BLAS और LAPACK पुस्तकालयों का उपयोग करता है। NumPy और SciPy MATLAB के लिए एक ड्रॉप-इन प्रतिस्थापन नहीं है, क्योंकि दो पुस्तकालयों ने मिलकर MATLAB की कार्यक्षमता में कुछ कमी है, लेकिन इस विशेष रैखिक बीजगणित कार्य के लिए, Python + NumPy + SciPy + Matototlib को अच्छी तरह से काम करना चाहिए।


मतलब जैसा ही सॉफ्टवेयर स्टैक प्राप्त करना असंभव है, मुझे लगता है। प्रोटोटाइपिंग के लिए किसी अन्य वातावरण का उपयोग करना भी नहीं चाहता है। समस्या यह है कि सही ढंग से
मटलब

@Grisu: मुझे लगता है कि एक ही सॉफ्टवेयर स्टैक को प्राप्त करना बहुत मुश्किल होगा, अपने पुस्तकालयों में लिंक करने का प्रयास करना। मैं उलझन में हूँ कि आप कैसे जानते हैं कि MATLAB में परिणाम सही है और C में परिणाम गलत है। क्या यह परीक्षण मैट्रिक्स का कुछ प्रकार है जिसमें ज्ञात गुण हैं? इस बिंदु पर, अरोनअहमदिया सही है; आर्किटेक्चर और सॉफ़्टवेयर स्टैक की प्रतिकृति से परे, आप अस्थिर एल्गोरिथ्म के साथ समान परिणाम प्राप्त करने की उम्मीद नहीं कर सकते। मुझे मूल रूप से दो साल पहले MATLAB मंचों में एक ही बात बताई गई थी।
ज्योफ ऑक्सबेरी

मेरी राय में क्यूआर अस्थिर नहीं है। मैं सीधे जाँच नहीं कर सकता कि कौन सा क्यूआर अपघटन सही है, लेकिन रैंक और क्यू मैट्रिक्स से मैं एक प्रोजेक्टर की गणना करता हूं और वहां मैं आसानी से सत्यापित कर सकता हूं कि क्या अच्छा या बुरा परिणाम मिलता है और मतलब से एक अच्छा है। लेकिन मैं मतलूब पुस्तकालयों के खिलाफ जोड़ने की कोशिश करता हूं।
एमके उर्फ ​​ग्रिसु

@Grisu: अच्छे परिणामों और सही परिणामों के बीच एक अलग अंतर है। मैंने हाल ही में एक गणना को गलत तरीके से लागू किया जिससे मेरे परिणाम शानदार दिखे। फिर भी, गणना गलत थी, और सही गणना ने मेरे परिणामों को कम प्रभावशाली बना दिया (लेकिन शुक्र है कि यह दर्शाता है कि मेरे परिणाम सही हैं)। क्या आप एक ऑर्थोगोनल प्रोजेक्टर या एक तिरछे प्रोजेक्टर की गणना करने का प्रयास कर रहे हैं? (मैं पूछता हूं क्योंकि मेरी थीसिस के महत्वपूर्ण हिस्से तिरछे प्रोजेक्टर पर हैं।)
जियोफ ऑक्सबेरी

1
@GeoffOxberry: fwiw, MATLAB के मेरे संस्करण पर, मैं कॉल कर सकता हूं internal.matlab.language.versionPlugins.blasऔर internal.matlab.language.versionPlugins.lapackBLAS और LAPACK संस्करण प्राप्त कर सकता हूं
Amro

6

रैंक-खुलासा करने वाले सॉफ्टवेयर पर लेस्ली फोस्टर का पेज देखें । रैंक-खुलासा क्यूआर की विफलताओं का विश्लेषण करने वालाxGEQP3 यह LAPACK वर्किंग नोट भी देखें ।

आपको यह पता लगाने में सक्षम होना चाहिए कि डीबगर में ब्रेकप्वाइंट सेट करके और स्टैक की जांच करके MATLAB किस रूटीन का उपयोग करता है। अंतिम बार मैंने देखा, कई साल पहले, MATLAB ने साझा पुस्तकालयों का उपयोग किया था, जिस स्थिति में प्रतीक नामों को छीना नहीं जा सकता था, इसलिए आप कॉल स्टैक पर फ़ंक्शन नाम देखेंगे (लेकिन तर्क नहीं क्योंकि यह निश्चित रूप से डिबगिंग जानकारी नहीं रख रहा है)।


रैंक-रिवीलिंग सॉफ़्टवेयर के पेज ने मदद नहीं की। आरआरक्यूआर प्रक्रिया का वर्णन था कि मेरे विचार में पहली चीज का उपयोग किया गया था, लेकिन यह कॉलम पिविंग विचार से भी बदतर परिणाम देता है।
एमके उर्फ ​​ग्रिसू

2
@ क्रिसू - यह आपकी मदद करनी चाहिए थी। xGEQP3एल्गोरिथ्म रैंक खुलासा करने के लिए पूरी तरह से सुरक्षित नहीं है। आप गारंटी है कि आप सही परिणाम प्राप्त करना चाहते हैं, तो आप SVD या एक सुरक्षित क्यूआर रूप में इस तरह का उपयोग करना चाहिए xGEQPXया xGEQPY। आप विभिन्न आर्किटेक्चर पर या अलग-अलग कार्यान्वयन में एक ही परिणाम वापस करने के लिए एक अस्थिर एल्गोरिथ्म की उम्मीद नहीं कर सकते हैं (MATLAB शायद एक पुराने LAPACK का उपयोग कर रहा है)।
एरन अहमदिया

मुझे पता है कि GEQP3 रैंक-खुलासा नहीं है लेकिन, यह RRQR सबरूटीन के मुकाबले अधिक सही परिणाम देता है। एसवीडी का उपयोग करना मेरे बाहरी एल्गोरिथ्म में बहुत महंगा है। मैं LAWN-176 के लेखकों में से एक से भी बात करूंगा और उसे लगता है कि यह त्रुटि बग से ढकी नहीं है। मैंने उसी परिणाम के साथ LAPACK 3.0.0 से DGEQPF / DGEQP3 की भी कोशिश की।
एमके उर्फ ​​ग्रिसू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.