LAPACK और BLAS का उपयोग करके लिए


12

मैं MATLAB से C ++ में एक मौजूदा कोड पोर्ट कर रहा हूं और (बजाय अधिक विशिष्ट रूप से ) हल करने के लिए एक रैखिक प्रणाली हैएक्सए=खएएक्स=ख

मैट्रिक्स , घने और सामान्य रूप का है, लेकिन 1000x1000 से बड़ा नहीं है। तो MATLAB में, समाधान फ़ंक्शन या फ़ॉरवर्ड-स्लैश नोटेशन द्वारा पाया जाता हैएmrdivide(b,A)x = b/A;

मुझे अपने C ++ कोड में BLAS और LAPACK दिनचर्या का उपयोग करके इसे कैसे हल करना चाहिए?

मैं LAPACK दिनचर्या से परिचित हूं DGESVजो लिए को हल करती है ।एएक्स=खएक्स

इसलिए, मुझे लगा कि मैट्रिक्स ट्रांसजेंड आइडेंटिटी का उपयोग करके कुछ हेरफेर करना है:

(एक्सए)टी=खटी

एटीएक्सटी=खटी

एक्सटी=(एटी)-1खटी

फिर DGESVट्रांसपोज़्ड पर परिचालन का उपयोग करके अंतिम रूप को हल करें । (इसलिए को स्थानांतरित करने के लिए लागत और सिस्टम को हल करने के लिए लागत) Aएटीए

क्या एक दृष्टिकोण अधिक कुशल है या अन्यथा बेहतर है ?

मैं मैट्रिक्स और वेक्टर कक्षाओं के साथ-साथ BOOST UBLAS लाइब्रेरी से BLAS कार्यान्वयन के साथ-साथ LAPACK लाइब्रेरी रूटीन के लिए बाइंडिंग के साथ काम कर रहा हूं। मैं अन्य कार्यों के लिए सफलतापूर्वक इस सेटअप का उपयोग कर रहा हूं और इन पुस्तकालयों तक सीमित समाधान खोजने की उम्मीद कर रहा हूं।

इसके अलावा, मुझे ध्यान देना चाहिए कि मैं कोड सेटअप के दौरान केवल कुछ ही बार इस प्रकार का ऑपरेशन कर रहा हूं, इसलिए प्रदर्शन एक महत्वपूर्ण चिंता का विषय नहीं है।

हो सकता है कि इस MATLAB प्रलेखन पर mrdivideदूसरों के लिए उपयोगी है।

जवाबों:


10

के लिए तुच्छ जवाब वर्ग : उपयोग जो हल भी के लिए एक टी एक्स = ख जब ।एdgesvxएटीएक्स=खTRANS = 'T'

कृपया ध्यान दें कि BLAS या LAPACK के साथ आपको शायद ही किसी मैट्रिक्स में ट्रांसफ़ॉर्मिंग (स्वैपिंग एलिमेंट्स) करना है: अधिकांश सबरूटीन TRANSमें ट्रांसज्यूशन मैट्रिक्स पर ऑपरेशन के लिए समायोजित करने के लिए या एक अलग मेमोरी लेआउट के साथ संग्रहीत मैट्रिक्स पर एक तर्क है। (ट्रांसपोज़न फोर्ट्रान-रिग्रेसिव मेमोरी लेआउट को C-contiguos वन और वाइसवर्स के लिए बदलने के बराबर है।)


उत्तर और स्पष्टीकरण के लिए धन्यवाद! मैंने LAPACK के साथ बहुत कम काम किया है और अब मैं ट्रांस विकल्प की तलाश करना जानता हूं। मुझे ट्रांस तर्क को काम करने में परेशानी हो रही है boost::numeric::bindings::lapack::gesvx(), लेकिन यह मेरे सवाल का हिस्सा नहीं है। अगर मुझे सफलता मिलती है, तो मैं यह नोट करूंगा कि यह कैसे करना है।
— नूह

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

ठीक है, मैं के gesvxमाध्यम से पारगमन फार्म का उपयोग करने की चाल मिली boost::numeric::bindings। फ़ंक्शन में ट्रांसपोज़्ड मैट्रिक्स लपेटें । यह पहचान करता है के रूप में पैरामीटर पक्षांतरित के प्रकार: एटीtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
— NoahR

0

आप SVD के QR अपघटन का उपयोग करके के छद्म व्युत्क्रम की गणना कर सकते हैं, जो कि LAPACK में शामिल हैं।ए

एक्सए=खएक्सक्यूआर=खएक्स=खआर-1क्यूटी

यह किसी भी आयताकार लिए काम करेगा ।ए


3
यदि आयताकार है (वर्गाकार नहीं), तो R , और अभिव्यक्ति R - 1 अपरिभाषित है। एआरआर-1
— ज्योफ ऑक्सबेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.