2009-06-02 9 views
6

मुझे परीक्षण करने की आवश्यकता है कि एक भिन्नता मैट्रिक्स विकर्ण है या नहीं। यदि नहीं, तो मैं Cholesky एलडीएल अपघटन करूँगा। लेकिन मैं सोच रहा था कि परीक्षण करने का सबसे विश्वसनीय और सबसे तेज़ तरीका मैट्रिक्स विकर्ण है? मैं फोरट्रान का उपयोग कर रहा हूँ।मैट्रिक्स विकर्ण होने पर परीक्षण कैसे करें?

पहली बात जो मेरे दिमाग में आती है वह है मैट्रिक्स के सभी तत्वों का योग लेना, और उस राशि से विकर्ण तत्वों को निकालना। अगर उत्तर 0 है, तो मैट्रिक्स विकर्ण है। कोई बेहतर विचार?

फोरट्रान में मैं

!A is my matrix 
k=0.0d0 
do i in 1:n #n is the number of rows/colums 
k = k + A(i,i) 
end do 

if(abs(sum(A)-k) < epsilon(k)*sum(A)) then 
#do cholesky LDL, which I have to write myself, haven't found any subroutines for that in Lapack or anywhere else 
end if 
+0

हो जाता है: आप एलडीएल एलडीएल मतलब 'अपघटन, नहीं। ;-) – Stobor

+0

इसके अलावा, सरल counterexample: [[1, -1], [1, 1]] आपके परीक्षण को पास करता है। – Stobor

+0

इसके अलावा: LAPACK एलडीएल 'decomp: http://www.netlib.org/lapack/single/ssptrf.f LAPACK Cholesky LL' decomp: http://www.netlib.org/lapack/single/spotrf.f – Stobor

उत्तर

0

गैर शून्य के लिए मैट्रिक्स खोजें

logical :: not_diag 
integer :: i, j 

not_diag = .false. 

outer: do i = 2, size(A,1) 
    do j = i, size(A, 2) 
    if (A(i,j) > PRECISION) then 
     not_diag = .true. 
     exit outer 
    end if 
    end 
end outer 

if (not_diag) then 
    ! DO LDL' decomposition 
end if 

महत्व देता डबल परिशुद्धता LAPACK दिनचर्या के साथ 'प' की जगह पहले 'एस' का उपयोग करें। तो spotrf dpotrf

http://www.netlib.org/lapack/double/

बस nitpick करने
+0

हाँ, लेकिन कोई dsptrf.f नहीं है, केवल ssptrf.f जो एलडीएल 'अपघटन करता है। डीपीओटीआरएफ एलएल 'अपघटन करता है। –

10

लिखेंगे यह बहुत बेहतर होगा बस सभी ऑफ विकर्ण तत्वों और परीक्षण पार करने के लिए अगर वे शून्य के पास हैं (की तुलना असमानता के लिए एक फ्लोटिंग प्वाइंट नंबर की संभावना है गोलाकार त्रुटियां और गलत परिणाम हो सकती हैं)।

सबसे पहले, एक बार जब आप कोई उल्लंघन करने वाला तत्व पाते हैं तो आप तुरंत ट्रैवर्सिंग को रोक सकते हैं और यह मैट्रिस का उल्लंघन करने पर महत्वपूर्ण समय घटने की अनुमति दे सकता है।

दूसरा, यह संभावित रूप से संकलक द्वारा बेहतर लूप अनलॉक करने की अनुमति देगा (फोरट्रान कंपाइलर्स अच्छी अनुकूलन रणनीतियों के लिए जाना जाता है) और कम अंतर-निर्देश निर्भरताओं के कारण तेज़ ऑन-चिप निष्पादन के लिए।

इस तथ्य में जोड़ें कि आपका सुझाए गए एल्गोरिदम अतिप्रवाह और त्रुटि संचय के लिए प्रवण है और "ट्रैवर्स-एंड-टेस्ट" एल्गोरिदम नहीं है।

+0

बहुत बहुत धन्यवाद, मैं इसे इस तरह से करूँगा। –

+0

+1। इसके अलावा, यह बहु-प्रोसेसर-अनुकूल है! – Stobor

+0

और एक सममित है इसलिए मैं केवल मैट्रिक्स के आधे पार करने के लिए जरूरत है ... आप फिर से धन्यवाद, मैं एक "वास्तविक" प्रोग्रामर नहीं हूँ, इसलिए मल्टी-प्रोसेसर, अंतर-निर्देश निर्भरता आदि के बारे में नहीं कह सकता: डी बस सांख्यिकीविद्। ;) –

संबंधित मुद्दे