MATLAB बैकस्लैश ऑपरेटर वर्ग मैट्रिसेस के लिए


36

मैं अपने कुछ कोड्स की तुलना "स्टॉक" MATLAB कोड्स से कर रहा था। मैं परिणामों पर हैरान हूं।

मैंने एक नमूना कोड चलाया (स्पार्स मैट्रिक्स)

n = 5000;
a = diag(rand(n,1));
b = rand(n,1);
disp('For a\b');
tic;a\b;toc;
disp('For LU');
tic;LULU;toc;
disp('For Conj Grad');
tic;conjgrad(a,b,1e-8);toc;
disp('Inv(A)*B');
tic;inv(a)*b;toc;

परिणाम:

    For a\b
    Elapsed time is 0.052838 seconds.

    For LU
    Elapsed time is 7.441331 seconds.

    For Conj Grad
    Elapsed time is 3.819182 seconds.

    Inv(A)*B
    Elapsed time is 38.511110 seconds.

घने मैट्रिक्स के लिए:

n = 2000;
a = rand(n,n);
b = rand(n,1);
disp('For a\b');
tic;a\b;toc;
disp('For LU');
tic;LULU;toc;
disp('For Conj Grad');
tic;conjgrad(a,b,1e-8);toc;
disp('For INV(A)*B');
tic;inv(a)*b;toc;

परिणाम:

For a\b
Elapsed time is 0.575926 seconds.

For LU
Elapsed time is 0.654287 seconds.

For Conj Grad
Elapsed time is 9.875896 seconds.

Inv(A)*B
Elapsed time is 1.648074 seconds.

कैसे बिल्ली एक बहुत बढ़िया है?


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

1
यह टिम डेविस के कोड cise.ufl.edu/research/sparse पर उपलब्ध है । इसके अलावा जब आप एक गैर तुच्छ समस्या है
अजीबता

1
"LULU" क्या है? आपको क्यों लगता है कि यह एक एलयू कारक और बाद में प्रत्यक्ष समाधान का एक अच्छा कार्यान्वयन है?
जेड ब्राउन

3
@ गैर- कार्यान्वयन क्या है? क्या आपने इसे स्वयं लिखा है? उच्च प्रदर्शन वाले घने रेखीय बीजगणित, जबकि आमतौर पर एल्गोरिदम को अच्छी तरह से समझा जाता है, आधुनिक हार्डवेयर पर कुशलतापूर्वक लागू करना आसान नहीं है। सबसे अच्छा BLAS / लैपैक कार्यान्वयन को उस आकार के मैट्रिक्स के लिए चरम के करीब होना चाहिए। इसके अलावा, आपकी टिप्पणियों से, मुझे यह आभास हो रहा है कि आपको लगता है कि एलयू और गॉसियन एलिमिनेशन अलग-अलग एल्गोरिदम हैं।
जेड ब्राउन

1
यह इंटेल एमकेएल का उपयोग करके लिखा गया एक फोरट्रान कोड कहता है।
तहकीकात

जवाबों:


37

माटलैब में, '\' कमांड एक एल्गोरिथ्म को आमंत्रित करता है जो मैट्रिक्स ए की संरचना पर निर्भर करता है और इसमें ए के गुणों पर चेक (छोटे ओवरहेड) शामिल हैं।

  1. यदि A विरल और बैंडेड है, तो एक बैंडेड सॉल्वर को नियोजित करें।
  2. यदि A एक ऊपरी या निचला त्रिकोणीय मैट्रिक्स है, तो एक पिछड़े प्रतिस्थापन एल्गोरिदम को नियोजित करें।
  3. यदि A सममित है और उसके पास वास्तविक सकारात्मक विकर्ण तत्व हैं, तो चोल्स्की फैक्टराइजेशन का प्रयास करें। यदि A विरल है, तो पहले भरण को कम करने के लिए रीऑर्डरिंग को नियोजित करें।
  4. यदि उपरोक्त मानदंडों में से कोई भी पूरा नहीं हुआ है, तो आंशिक धुरी के साथ गौसियन उन्मूलन का उपयोग करके एक सामान्य त्रिकोणीय कारक करें।
  5. यदि A विरल है, तो UMFPACK लाइब्रेरी को नियोजित करें।
  6. यदि ए वर्ग नहीं है, तो अनिर्धारित सिस्टम के लिए क्यूआर फ़ैक्टराइज़ेशन पर आधारित एल्गोरिदम को रोजगार दें।

ओवरहेड को कम करने के लिए मतलाब में लिंसोल्व कमांड का उपयोग करना संभव है और इन विकल्पों में से एक उपयुक्त सॉल्वर का चयन करें।


यह मानते हुए कि मैं सभी तत्वों नॉनज़रो (घनत्व के उच्च स्तर) के साथ 10000x10000 असंरचित घने मैट्रिक्स के साथ काम कर रहा हूं, मेरा सबसे अच्छा दांव क्या होगा? मैं उस 1 एल्गोरिथ्म को अलग करना चाहता हूं जो घने मैट्रीस के लिए काम करता है। क्या यह LU, QR या गाऊसी उन्मूलन है?
तहकीकात

1
स्टेप 4 की तरह लगता है जहाँ गौसियन एलिमिनेशन को लागू किया जाता है जो सबसे सामान्य मामले से मेल खाता है जहाँ प्रदर्शन को बढ़ावा देने के लिए ए की कोई संरचना का शोषण नहीं किया जा सकता है। तो, मूल रूप से यह एक एलयू फैक्टराइजेशन है और बाद में एक पश्चगामी प्रतिस्थापन कदम के बाद एक आगे।
एलन पी Engsig-Karup

धन्यवाद! मुझे लगता है कि इससे मुझे सोचने की दिशा मिलती है। वर्तमान में, गाऊसी उन्मूलन ऐसी असंरचित समस्याओं को हल करने के लिए सबसे अच्छा है, क्या यह सही है?
तहकीकात

37

यदि आप यह देखना चाहते हैं कि a\bआपके विशेष मैट्रिक्स के लिए आप क्या सेट कर सकते हैं spparms('spumoni',1)और यह पता लगा सकते हैं कि आप किस एल्गोरिथ्म से प्रभावित थे। उदाहरण के लिए:

spparms('spumoni',1);
A = delsq(numgrid('B',256));
b = rand(size(A,2),1);
mldivide(A,b);  % another way to write A\b

उत्पादन होगा

sp\: bandwidth = 254+1+254.
sp\: is A diagonal? no.
sp\: is band density (0.01) > bandden (0.50) to try banded solver? no.
sp\: is A triangular? no.
sp\: is A morally triangular? no.
sp\: is A a candidate for Cholesky (symmetric, real positive diagonal)? yes.
sp\: is CHOLMOD's symbolic Cholesky factorization (with automatic reordering) successful? yes.
sp\: is CHOLMOD's numeric Cholesky factorization successful? yes.
sp\: is CHOLMOD's triangular solve successful? yes.

इसलिए मैं देख सकता हूं कि इस मामले में "CHOLMOD" का उपयोग करके "\" समाप्त हो गया।


3
नई MATLAB सेटिंग्स के लिए +1 मैंने कभी नहीं सुना। अच्छा खेला, सर।
ज्यॉफ ऑक्सीबेरी

2
धन्यवाद! यह अंदर है help mldivide
ड्रैंक्सो

16

विरल मैट्रिस के लिए, मैटलैब " \" ऑपरेशन के लिए UMFPACK का उपयोग करता है , जो आपके उदाहरण में, मूल रूप से मूल्यों के माध्यम से चलता है a, उन्हें बदल देता है और उन्हें मूल्यों के साथ गुणा करता है b। इस उदाहरण के लिए, हालांकि, आपको उपयोग करना चाहिए b./diag(a), जो बहुत तेज़ है।

घने प्रणालियों के लिए, बैकस्लैश-ऑपरेटर थोड़ा अधिक जटिल है। क्या का एक संक्षिप्त विवरण किया जब दिया जाता है है यहाँ । उस वर्णन के अनुसार, आपके उदाहरण में, मतलाब a\bपिछड़े प्रतिस्थापन का उपयोग करके हल करेगा । सामान्य वर्ग मैट्रिसेस के लिए, एक एलयू-अपघटन का उपयोग किया जाता है।


पंजीकृत। स्पार्सिटी, एक डायग मैट्रिक्स का आक्रमण बस विकर्ण तत्वों का पारस्परिक होगा ताकि b./diag(a) काम करेगा लेकिन a \ b सामान्य विरल मैट्रिस के लिए भी अजीब तरह से काम करता है। क्यों नहीं Linsolve या LULU (LU का मेरा अनुकूलित संस्करण) उस मामले में घने मैट्रिस के लिए तेजी से नहीं है।
inquest

@ ननॉक्सिक क्या आपका एलयूयू घने मैट्रिक्स की तिरछापन या त्रिकोणीयता का पता लगाने के लिए कुछ भी करता है? यदि नहीं, तो यह हर मैट्रिक्स के साथ लंबे समय तक ले जाएगा, भले ही इसकी सामग्री या संरचना की परवाह किए बिना।
पेड्रो

कुछ हद तक। लेकिन, linsolve OPT झंडे के साथ, मैंने संरचना के बारे में परिभाषित करने के लिए सब कुछ परिभाषित किया। फिर भी, a \ b तेज है।
'19

@Nunoxic, हर बार जब आप उपयोगकर्ता फ़ंक्शन को कॉल करते हैं, तो आप ओवरहेड का कारण बनते हैं। मतलाब आंतरिक रूप से बैकस्लैश के लिए सब कुछ करता है, जैसे कि दाहिने हाथ की तरफ का अपघटन और बाद का अनुप्रयोग, बहुत कम ओवरहेड के साथ, और इस प्रकार तेज होगा। इसके अलावा, आपके परीक्षणों में, आपको विश्वसनीय समय प्राप्त करने के लिए केवल एक कॉल का उपयोग करना चाहिए, जैसे tic; for k=1:100, a\b; end; toc
पेड्रो

5

अंगूठे के एक नियम के रूप में, यदि आपके पास उचित जटिलता का एक विरल मैट्रिक्स है (यानी, इसमें 5-पॉइंट स्टैंसिल होना जरूरी नहीं है, लेकिन वास्तव में स्टोक्स समीकरणों का विवेकाधिकार हो सकता है, जिसके लिए प्रति पंक्ति गैर-संख्या की संख्या) 5 से अधिक बड़ा), फिर एक विरल प्रत्यक्ष विलायक जैसे कि UMFPACK आमतौर पर एक पुनरावृत्त क्रायलोव सॉल्वर को मारता है यदि समस्या लगभग 100,000 अज्ञात से बड़ी नहीं है।

दूसरे शब्दों में, 2 डी विवेक से उत्पन्न अधिकांश विरल मैट्रिस के लिए, एक सीधा सॉल्वर सबसे तेज विकल्प है। केवल 3 डी समस्याओं के लिए जहां आप जल्दी से 100,000 से अधिक अज्ञात हो जाते हैं क्या यह पुनरावृत्त सॉल्वर का उपयोग करने के लिए अनिवार्य हो जाता है।


3
यह मेरे लिए स्पष्ट नहीं है कि यह प्रश्न का उत्तर कैसे देता है, लेकिन मैं मुद्दे को भी आधार के साथ लेता हूं। यह सच है कि प्रत्यक्ष सॉल्वर मामूली आकार की 2D समस्याओं के लिए अच्छी तरह से काम करते हैं, लेकिन प्रत्यक्ष सॉल्वर 100k अनजान से पहले 3 डी कुओं में पीड़ित होते हैं (शीर्ष विभाजक 2D की तुलना में बहुत बड़े हैं)। इसके अलावा, मेरा दावा है कि ज्यादातर मामलों में (जैसे अण्डाकार संचालक), मध्यम विलायकों को मध्यम आकार की 2D समस्याओं के लिए भी प्रत्यक्ष सॉल्वरों की तुलना में अधिक तेज बनाया जा सकता है, लेकिन ऐसा करने के लिए महत्वपूर्ण प्रयास कर सकते हैं (जैसे बहुगुण प्रदर्शन करने के लिए सही सामग्री का उपयोग करना) ।
जेड ब्राउन

1
यदि आपकी समस्याएं यथोचित रूप से छोटी हैं और आप अंतर्निहित सॉल्वर को डिजाइन करने के बारे में नहीं सोचना चाहते हैं, या यदि आपकी समस्याएं बहुत कठिन हैं (जैसे उच्च-आवृत्ति मैक्सवेल) और आप अपने करियर को अच्छे सॉल्वर को डिजाइन करने के लिए समर्पित नहीं करना चाहते हैं, तो मैं सहमत हैं कि विरल प्रत्यक्ष सॉल्वर एक बढ़िया विकल्प हैं।
जेड ब्राउन

वास्तव में मेरी समस्या एक अच्छे घने विलायक को डिजाइन करना है। मेरे पास कोई विशेष एप्लिकेशन नहीं है (जैसे, कोई संरचना नहीं)। मैं अपने कुछ कोड ट्विक करना चाहता था और वर्तमान में जो उपयोग किया जाता है, उसके साथ उन्हें प्रतिस्पर्धी बनाता हूं। मैं बस एक बी के बारे में उत्सुक था और यह कैसे हमेशा मेरे कोड से बकवास करता है।
प्रातः

@JedBrown: हाँ, हो सकता है कि प्रयास के एक महत्वपूर्ण राशि के साथ छोटी 2d समस्याओं के लिए भी प्रत्यक्ष सॉल्वर को मात देने के लिए पुनरावृत्त सॉल्वर मिल सकते हैं। लेकिन ऐसा क्यों? <100k अज्ञात के साथ समस्याओं के लिए, 2 डी में विरल प्रत्यक्ष सॉल्वर काफी तेज हैं। मैं जो कहना चाहता था, वह है: ऐसी छोटी समस्याओं के लिए, अपना समय बिताने और मापदंडों के सर्वोत्तम संयोजन का पता लगाने में खर्च न करें - बस ब्लैकबॉक्स ले जाएं।
वोल्फगैंग बैंगर्थ

पहले से ही एक स्पार्स चोल्स्की और (मैट्रिक्स-आधारित) ज्यामितीय मल्टीग्रिड के बीच "आसान" 2D समस्याओं के लिए 100k dofs के साथ 5-पॉइंट स्टैंसिल (~ 0.05 सेकंड की तुलना में 0.5 सेकंड) का उपयोग करके परिमाण रन-टाइम अंतर पहले से ही है। यदि आपका स्टैंसिल दूसरे पड़ोसियों का उपयोग करता है (उदाहरण के लिए चौथे क्रम का विवेक, नॉनलाइनियर रिओलॉजी, स्थिरीकरण आदि के कुछ विकल्पों के लिए न्यूटन), तो शीर्ष विभाजकों का आकार लगभग दोगुना हो जाता है, इसलिए प्रत्यक्ष समाधान की लागत लगभग 8x तक बढ़ जाती है (लागत अधिक होती है) समस्या-एमजी के लिए निर्भर)। कई समय के कदम या अनुकूलन / UQ छोरों के साथ, ये अंतर महत्वपूर्ण हैं।
जेड ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.