मैं वर्तमान में मैट्रिक्स लिए एक अच्छे रैंक के अनुमान को सस्ते में गणना करने की कोशिश कर रहा हूं । इसलिए मैं एक स्तंभ का उपयोग करते हुए क्यूआर डीकंपोस्टियन की गणना करता हूं
[Q,R,E]=qr(A)
मतलाब में मैं का उपयोग करते हुए रैंक का अनुमान लगाता हूं
tol = size(A,n)*eps*norm(A,'fro');
r = sum(abs(diag(R))>tol)
यह ठीक काम करता है और R की सभी विकर्ण प्रविष्टियों पर एक प्लॉट दिखता है:
यदि पूरे एल्गोरिथ्म को C / फोरट्रान I में बदल दिया जाता है, तो LGEACK से DGEQP3 का उपयोग करते हुए [Q, R, E] = qr (A) को प्रतिस्थापित किया जाता है, जो एक स्तंभ को क्यूआर अपघटन की गणना करता है। लेकिन अगर मैं रैंक के लिए एक ही अनुमान का उपयोग करता हूं तो मुझे ज्यादातर कुछ गलत लगता है। DGEQP3 से उत्पादित लिए एक ही प्लॉट जैसा दिखता है
इनपुट मैट्रिक्स दोनों प्रयोगों के लिए बिल्कुल समान है।
मेरा सवाल अब यह है कि मैटलैब से स्तंभ अपवाहित क्यूआर अपघटन पर लैपैक फ़ंक्शन किस पर निर्भर करता है?
किसी भी मदद के लिए धन्यवाद, Grisu
संपादित करें: DGEQPF एक ही गलत परिणाम देता है।
EDIT2:
- इनपुट मैट्रिक्स घना है और रूप में निर्मित होता है।E + s i g n ( E , F )
- यहाँ उपलब्ध है: http://www-e.uni-magdeburg.de/makoehle/A.mtx.gz (मैट्रिक्स मैट्रिक्स प्रारूप)
- गलत : http://www-e.uni-magdeburg.de/makoehle/R_wrong.mtx.gz
- मैंने OpenBlas / GotoBLAS (64 बिट) के साथ LAPACK 3.4.0 का उपयोग किया
- मतलाब 7, 2007 बी, 2010 बी लिनक्स 32 बिट
Edit3: - GDB का उपयोग करके मुझे पता चला, कि Matlab 2010 ने DGEQP3: # 3 0xaa46ce2f को dgeqp3_ () से /usr/ubuntu10.04/matlabr2010.b/bin/glnx86/..///bin/glnx86/// पर कॉल किया। ./bin/glnx86/mllapack.so मुझे LAPACK (3.4.0 वर्किंग नोट 176 में उल्लिखित फ़िक्स का उपयोग करके गलत परिणाम) क्यों प्राप्त होता है?