बार-बार


12

मैं एक समस्या को हल करने के लिए MATLAB का उपयोग कर रहा हूं जिसमें प्रत्येक टाइमस्टेप पर को हल करना शामिल है , जहां समय के साथ बदल जाता है। अभी, मैं MATLAB का उपयोग करके इसे पूरा कर रहा हूं :बीAx=bbmldivide

x = A\b

मेरे पास आवश्यकतानुसार अधिक से अधिक प्री-कॉम्प्लेक्शन करने की सुविधा है, इसलिए मैं सोच रहा हूं कि क्या कोई तेज और / या अधिक सटीक विधि है mldivide। आमतौर पर यहाँ क्या किया जाता है? सबको शुक्रीया!


1
क्या आपको की संरचना के बारे में विशिष्ट ज्ञान है ? उदाहरण के लिए, क्या यह सममित है? सकारात्मक रूप से निश्चित? Tridiagonal? ओर्थोगोनल? A
डोमिनिक

मैट्रिक्स एक सघन वर्ग मैट्रिक्स है। A
संदेह

3
यदि आपको पर कोई अन्य ज्ञान नहीं है , तो नीचे दिए गए उत्तर में वर्णित एल यू फैक्टराइजेशन आपकी सबसे अच्छी शर्त है। ALU
डोमिनिक

जवाबों:


14

सबसे स्पष्ट बात जो आप कर सकते हैं वह है पूर्ववर्ती

[L,U] = lu(A) ~ ओ (एन ^ 3)

तब तुम सिर्फ संगणना करो

x = U \ (L \ b) ~ ओ (2 एन ^ 2)

यह लागत को काफी कम कर देगा और इसे और तेज कर देगा। सटीकता वही होगी।


1
नोट, प्रलेखन से , एल जरूरी त्रिकोणीय कम नहीं है। यह उत्तर संभवतः एक सीधे हल की तुलना में तेज़ होगा, हालांकि मैं यह सुनिश्चित करने के लिए सावधान रहूंगा कि L \ b कमांड सही क्रम में L को हल करने के लिए जानने के लिए पर्याप्त स्मार्ट है (यह संभावना है, लेकिन यह निश्चित रूप से नहीं कहता है प्रलेखन में)।
गोड्रिक सीर

हाँ, आप सही हैं, L एक कम-त्रिकोणीय मैट्रिक्स और एक क्रमचय मैट्रिक्स का उत्पाद है। लेकिन अगर मैं यह नहीं पहचानता कि यह सब करना है तो मुझे बहुत नुकसान होगा L\b। क्योंकि मैंने इस सटीक लाइन का उपयोग उच्च-प्रदर्शन कोड में उन लोगों द्वारा किया जा रहा है, जिन्हें मैं विशेषज्ञों का मानना ​​है।
मिलिंद आर

8
mldivide इस तरह की प्रणाली को हल करने में अनुमत त्रिकोणीय मैट्रिक्स को पहचानता है और सही चीज करता है। हालाँकि, मेरे प्रयोगों में, यह २००० से १०००० से १०००० के बीच १०० से १०००० तक मैट्रिक्स के लिए समाधान प्रक्रिया को धीमा बनाता है। इस प्रकार आप [एल का उपयोग करके स्पष्ट रूप से क्रमचय पर नज़र रखना बेहतर होगा , यू, पी] = लू (पी)। O(n2)
ब्रायन Borchers

1
इसके अलावा, यदि आपका मैट्रिक्स विरल है, तो आपको सिस्टम को हल करने में स्पार्सिटी का लाभ उठाना चाहिए। यह करने के लिए सबसे आसान तरीका लगता है कि बनाने के लिए है एक = विरल (ए) का उपयोग कर की गणना LU गुणन से पहले से विरल प्रारूप में संग्रहित है। आप एलयू फैक्ट्रीजेशन के दौरान भराव को कम करने के लिए ए की पंक्तियों को अनुमति देने का भी प्रयास कर सकते हैं। A
ब्रायन Borchers

3
@BrianBorcher जहां तक ​​मुझे पता है, क्रमचय का ट्रैक रखने का सबसे अच्छा तरीका डॉक्स[L,U,p] = lu(A,'vector'); x = U\(L\b(p)); में उदाहरण 3 देखें । lu
स्टेफानो एम

5

हमने इस विषय के बारे में अपने वैज्ञानिक कंप्यूटिंग पाठ्यक्रमों में कुछ व्यापक कंप्यूटर प्रयोगशालाएँ कीं। हमारे द्वारा वहां की गई "छोटी" गणनाओं के लिए, मटलब के बैकस्लैश ऑपरेटर हमेशा की तुलना में कहीं अधिक तेज थे, भले ही हमने अपने कोड को जितना संभव हो सके अनुकूलित किया था और सभी मेट्रिसेस को पहले से री-ऑर्किड किया था (उदाहरण के लिए, रिवर्स मैकरिस के लिए स्पार्स मैट्रिसेस के लिए ऑर्डर करना) ।

आप हमारे लैब निर्देशों में से एक को देख सकते हैं । आपके प्रश्न का उत्तर पृष्ठ 4 पर (शीघ्र ही) शामिल है।

इस विषय पर एक अच्छी किताब चेनी ने लिखी है ।


4

मान लीजिए एक n × n घना मैट्रिक्स है और आपको A x i = b i , i = 1 m को हल करना होगा । अगर m काफी बड़ा है तो इसमें कुछ भी गलत नहीं हैAn×n Axi=bii=1mm

V = inv(A);
...
x = V*b;

फ्लॉप के लिए हैं और O ( n 2 ) के लिए , इसलिए मी के प्रयोग के लिए ब्रेक-सम मूल्य निर्धारित करने के लिए कुछ प्रयोग की आवश्यकता है ...O(n3)inv(A)O(n2)V*bm

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

कुछ नोट

स्थिरता और त्रुटि विश्लेषण के लिए कृपया इस भिन्न उत्तर के लिए टिप्पणियों को देखें , विशेष रूप से विक्टरलियू द्वारा।

mn

टाइमिंग 5 के एक काफी स्थिर UNIX लोड औसत के साथ 12 कोर कंप्यूटर पर Matlab R2011b के साथ किया गया था; tic, tocतीन जांच का सबसे अच्छा समय।


वास्तव में, त्रिकोणीय विलायक की तुलना में मैट्रिक्स-वेक्टर में कहीं अधिक समानता उपलब्ध है, इसलिए यदि किसी भी तरह से समानांतर (मल्टीकोर / जीपीयू / आदि ...) में गणना की जाती है तो यह और भी स्पष्ट होना चाहिए।
एरन अहमदिया

@AronAhmadia मैं सहमत हूं: केवल ऑपरेशन गणना के आधार पर ब्रेक-इवन पॉइंट अनुमान केवल एक धारावाहिक कार्यान्वयन के लिए समझ में आता है।
स्टेफानो एम

1
ध्यान दें कि चीजें बहुत भिन्न होंगी यदि A मैट्रिक्स विरल है - उलटा आमतौर पर काफी सघन होगा, जबकि LU कारक आमतौर पर यथोचित विरल होते हैं, LU की दिशा में चीजों को तेजी से वापस करते हुए।
ब्रायन Borchers

1
A

1
inv(A)Ax=bbBA\B

2

इस प्रश्न पर एक नज़र डालें , उत्तर दिखाते हैं कि mldivideकाफी चतुर है, और यह भी सुझाव देता है कि कैसे देखना है कि मैटलैब हल करने के लिए क्या उपयोग करता है A\b। यह आपको अनुकूलन विकल्पों के बारे में संकेत दे सकता है।


0

बैकस्लैश का उपयोग कम या ज्यादा के बराबर होता है inv(A)*B, यदि आप इसे स्वतंत्र रूप से कोड कर रहे हैं, तो बाद वाला अधिक सहज हो सकता है। वे उसी के बारे में हैं (बस गणना कैसे की जाती है) में भिन्न हैं, हालांकि आपको स्पष्टीकरण के लिए मतलाब प्रलेखन की जांच करनी चाहिए।

आपके प्रश्न का उत्तर देने के लिए, बैकस्लैश आमतौर पर ठीक है, लेकिन यह द्रव्यमान मैट्रिक्स के गुणों पर निर्भर करता है।


1
गणितीय रूप से आमंत्रित (ए) * बी संख्यात्मक रूप से एक ही है, लेकिन वास्तव में व्युत्क्रम का गठन कम कुशल और कम सटीक दोनों है। यदि आप रैखिक बीजगणित को सीखने के लिए काम कर रहे हैं, तो यह स्वीकार्य हो सकता है, लेकिन मेरा तर्क है कि आपको प्रतिलोम बनाने के लिए एक बहुत अच्छे कारण की आवश्यकता होगी।
गॉड्रिक सेर

लेकिन आप कभी भी गणना क्यों करेंगे inv(A)क्योंकि अकेले की तुलना में अधिक महंगा है A\b?
डोमिनिक

7
@Godric: हाल ही में एक पेपर है जो "मिथ" पर चर्चा करता है, जो कि (A) * b कम सटीक है: ArXiv पर । यह कहते हुए कि आमतौर पर वास्तविक व्युत्क्रम की गणना करने का कोई कारण नहीं है, लेकिन सिर्फ 'कहा गया है।
विक्टर लियू

3
@ मुख्य: त्रिकोणीय तलवों मैट्रिक्स-वेक्टर गुणा की तुलना में बहुत कम समानांतर हैं, और परिष्कृत पूर्वनिर्मित पुनरावृत्ति विधियां अक्सर उप-डोमेन पर सीधे तरीकों का उपयोग करती हैं। यह समानता को बेहतर बनाने के लिए कुछ मामूली आकार के घने त्रिकोणीय मैट्रिक्स के व्युत्क्रमों को स्पष्ट रूप से बनाने के लिए अक्सर उपयोगी होता है।
जैक पॉल्सन

@VictorLiu: लेख के लिए धन्यवाद। मैं अपने सटीकता कथन पर सही खड़ा हूं (कम से कम आमंत्रण के स्मार्ट कार्यान्वयन के लिए) (ए)।
गोड्रिक सीर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.