2012-10-07 96 views
6

हल करें यदि मैं पूर्ण ऊपरी त्रिकोणीय प्रणाली को हल करना चाहता हूं, तो मैं linsolve(A,b,'UT') पर कॉल कर सकता हूं। हालांकि यह वर्तमान में स्पैर मैट्रिस के लिए समर्थित नहीं है। मैं इससे कैसे उबरूं?* स्पैस * ऊपरी त्रिभुज प्रणाली

+1

['full'] (http://www.mathworks.com/help/matlab/ref/full.html) का उपयोग करें? – chaohuang

+4

@chaohuang एक बहुत बुरा विचार है। वह किसी कारण से 'स्पैस' का उपयोग करता है। – angainor

+0

मेरे अपडेट किए गए उत्तर को देखें। – angainor

उत्तर

3

संपादित के बाद क्या आप की जरूरत एक त्रिकोणीय का समाधान प्रक्रिया, यह भी पिछड़े/आगे प्रतिस्थापन कहा जाता है, आप कर सकते हैं उस के लिए साधारण MATLAB बैकस्लैश \ ऑपरेटर का उपयोग करें:

x = U\b 

मूल जवाब में उल्लेख किया है, MATLAB तथ्य यह है कि अपने मैट्रिक्स त्रिकोणीय है पहचान लेंगे। इसके बारे में सुनिश्चित करने के लिए, आप SuiteSparse में प्रदर्शन की तुलना cs_usolve प्रक्रिया से कर सकते हैं। यह सी में कार्यान्वित एक मैक्स फ़ंक्शन है जो ऊपरी त्रिकोणीय स्पैर मैट्रिक्स के लिए स्पैर त्रिकोणीय हल की गणना करता है (वहां भी समान कार्य होते हैं: cs_lsolve, cs_utsolve और cs_ltsolve)।

आप स्पैस चोलस्की कारक के संदर्भ में मूल MATLAB और cs_l(t)solve के performance comparison पर एक नज़र डाल सकते हैं। अनिवार्य रूप से, MATLAB प्रदर्शन अच्छा है। केवल ख़तरा यदि आप एक स्थानांतरित कर प्रणाली

x = U'\b 

MATLAB नहीं पहचान करता है कि हल करने के लिए करना चाहते हैं और स्पष्ट रूप से U के पक्षांतरित बनाता है। उस स्थिति में आपको cs_utsolve स्पष्ट रूप से कॉल करना चाहिए।

मूल जवाब आपके सिस्टम सममित है और आप केवल ऊपरी त्रिकोणीय मैट्रिक्स हिस्सा स्टोर chol सममित मैट्रिक्स संभालती है (इस तरह मैं अपने प्रश्न में पूर्ण समझा जाता है), और यदि Cholesky अपघटन आप के लिए उपयुक्त है, हैं, यदि आपका मैट्रिक्स सकारात्मक निश्चित है। अनिश्चितकालीन मैट्रिस के लिए आप ldl का उपयोग कर सकते हैं। दोनों सिमेट्रिक मैट्रिक्स भागों पर स्पैस स्टोरेज और काम संभालते हैं।

नए मैटलैब संस्करण cholmod and suitesparse का उपयोग करते हैं। यह अब तक का सबसे अच्छा प्रदर्शन करने योग्य Cholesky कारक है। Matlab में यह समानांतर बाल्स में समानांतर है।

कारक आप ऊपर कार्यों से प्राप्त ऊपरी त्रिकोणीय मैट्रिक्स एल ऐसी है कि

A=LL' 

तुम सब अब अग्रेषित करने की आवश्यकता प्रदर्शन कर रहा है और पीछे की ओर प्रतिस्थापन है, जो सरल और सस्ता है। matlab में यह स्वतः ही था बैकस्लैश ऑपरेटर

x=L'\(L\b) 

मैट्रिक्स विरल हो सकता है, और matlab पहचानेंगे कि यह/कम त्रिकोणीय ऊपरी है में किया जाता है। आप cholesky कारककरण का उपयोग कर प्राप्त कारकों के लिए आगे की प्रतिस्थापन के साथ इस कॉल का उपयोग भी करेंगे।

+2

मुझे लगता है कि उसका मतलब है 'ए = ट्राउ (...)' (पूर्ण) बनाम 'ए = स्पैस (त्रियू (...)) '(स्पैस) –

+0

@ रोडील्डेंहिस ओह, अब मैंने इसे फिर से पढ़ा है मुझे लगता है कि आप सही हैं । लेकिन मेरे जवाब में वैसे भी त्रिभुज हल (पिछड़ा/आगे प्रतिस्थापन) के बारे में जानकारी शामिल है - अंत में यह वही है जो आप अपने मैट्रिक्स को कारगर बनाने के बाद करते हैं :) – angainor

1

आप अपनी विरल मैट्रिक्स पर MLDIVIDE (\) या MRDIVIDE (/) ऑपरेटर का उपयोग कर सकते हैं ...

4

यूटी और एलटी सिस्टम हल करने के लिए सबसे आसान सिस्टम में से हैं। इसके बारे में on the wiki पढ़ें।

%# some example data 
A = sparse(triu(rand(100))); 
b = rand(100,1); 

%# solve UT system by back substitution  
x = zeros(size(b)); 
for n = size(A,1):-1:1  
    x(n) = (b(n) - A(n,n+1:end)*x(n+1:end))/A(n,n);  
end 

प्रक्रिया एलटी प्रणाली के लिए काफी समान है: यह जानने के बाद, यह अपने स्वयं के केन्द्र शासित प्रदेशों या एलटी solver लिखने के लिए आसान है।

कहा करने के बाद कि, यह मैटलैब के बैकस्लैश ऑपरेटर का उपयोग करने के लिए आम तौर पर बहुत आसान है और तेजी से होता है:

x = A\b 

जो भी पुर्जों मैट्रिक्स के लिए काम करता है, के रूप में नैट पहले ही संकेत दे।

ध्यान दें कि यह ऑपरेटर यूटी सिस्टम भी हल करता है जिसमें गैर-वर्ग A है या A में कुछ तत्व शून्य (या < eps) के मुख्य विकर्ण पर बराबर हैं। यह इन मामलों को कम से कम वर्गों में हल करता है, जो आपके लिए वांछनीय नहीं हो सकता है या नहीं। आप बाहर ले जाने से पहले इन मामलों के लिए जांच कर सकता है हल:

if size(A,1)==size(A,2) && all(abs(diag(A)) > eps) 
    x = A\b; 
else 
    %# error, warning, whatever you want 
end 

(वापस) के बारे में और अधिक पढ़ें स्लेश ऑपरेटर

>> help \ 

या

>> help slash 
मैटलैब कमांड प्रॉम्प्ट पर

टाइप करके ।

+0

बेशक मैं उस बैक प्रतिस्थापन को स्वयं लागू कर सकता हूं, मैंने सोचा कि यह स्पष्ट है :) समस्या यह है कि फॉर-लूप आमतौर पर मैटलैब से बचा जाता है क्योंकि वे बहुत धीमे होते हैं। स्लैश ऑपरेशन त्रिकोणीय matrices के लिए वापस प्रतिस्थापन का उपयोग करने की गारंटी है? – olamundo

+0

@noam: एक नज़र डालें [यहां] (http://scicomp.stackexchange.com/questions/1001/how-does-the-matlab-backslash-operator-solve-ax-b-for-square-matrices)। –

+1

\ बैकस्लैश, या बाएं डिवीजन ('mldivide') है, जबकि '/' एक स्लैश, या दायां विभाजन ('mrdivide') है। – angainor