2012-02-01 26 views
5

एन-बाय-एम मैट्रिक्स ए को देखते हुए, इसकी गारंटी है कि n> m = रैंक (ए), और n-by-1 कॉलम v, क्या है यह जांचने का सबसे तेज़ तरीका है कि [ए वी] रैंक से ए से काफी बड़ा है?यह जांचने का सबसे तेज़ तरीका है कि कोई वेक्टर मैट्रिक्स रैंक

मेरे आवेदन के लिए, ए स्पैस है, एन लगभग 2^12 है, और एम 1: एन -1 में कहीं भी है। रैंक की तुलना (पूर्ण ([ए वी])) मेरी मशीन पर लगभग एक सेकंड लेता है, और मुझे इसे हजारों बार करने की ज़रूरत है, इसलिए मुझे एक तेज़ तरीका खोजने में बहुत खुशी होगी।

+0

आप कहते हैं कि आपको यह 10k बार करने की ज़रूरत है। रन से रन में क्या परिवर्तन? जैसे 'ए 'हमेशा वही है और आप कई वैक्टरों के खिलाफ जांच करते हैं' v'? या प्रत्येक रन के लिए 'ए' और 'v' अलग हैं? –

+0

@FlorianBrucker मैं ए के साथ तुलनात्मक रूप से कुछ कॉलम शुरू करता हूं, और फिर मेरे पास एक लूप है जो ~ 20K बार चलता है, हर बार कुछ विशिष्ट तरीके से एक नया वी उत्पन्न करता है, यह देखने के लिए जांच करता है कि यह ए के कॉलम स्पेस से रैखिक रूप से स्वतंत्र है या नहीं, और यदि यह है, तो इसे ए –

+1

में जोड़ना सबसे तेज़ समाधान नल-स्पेस को नए वैक्टर 'v' बनाने के लिए बाधा के रूप में उपयोग करना हो सकता है। – Jonas

उत्तर

1

शायद आप A*x=v सिस्टम को हल करने का प्रयास कर सकते हैं, यदि इसका कोई समाधान है जिसका मतलब है कि रैंक बढ़ता नहीं है।

x=(B\A)'; 
norm(A*x-B) %% if this is small then the rank does not increase 
+0

अच्छा सुझाव, लेकिन यह मेरे परीक्षण मामलों के साथ रैंक ([पूर्ण (ए) v]) कॉलिंग से थोड़ा अधिक समय गहन प्रतीत होता है - 1 सेकंड की तुलना में लगभग 4 सेकंड। –

6

दोहराया हल करने के लिए यदि आप अशक्त अंतरिक्ष के एक गणना करने के लिए खर्च कर सकते हैं कोई जरूरत नहीं है। शून्य करने के लिए सिर्फ एक कॉल पर्याप्त होगा। एक नए वेक्टर वी को देखते हुए, यदि वी और नलस्पेस आधार के साथ डॉट उत्पाद गैर-शून्य है, तो वी मैट्रिक्स के रैंक को बढ़ाएगा। उदाहरण के लिए, मान लीजिए हम मैट्रिक्स एम, जो निश्चित रूप से की 2.

M = [1 1;2 2;3 1;4 2]; 
nullM = null(M')'; 

एक रैंक जाएगा एक नया स्तंभ वेक्टर [1, 1, 1, 1] है है रैंक अगर हम इसे एम के साथ जोड़ दिया वृद्धि?

nullM*[1;1;1;1] 
ans = 
     -0.0321573705742971 
     -0.602164651199413 

हां, क्योंकि इसमें कम से कम एक आधार शून्य पर नल-शून्य प्रक्षेपण है।

कैसे इस सदिश के बारे में:

nullM*[0;0;1;1] 
ans = 
     1.11022302462516e-16 
     2.22044604925031e-16 

इस मामले में, दोनों संख्या अनिवार्य रूप से शून्य हैं, तो सवाल में वेक्टर एम

के पद बिंदु है वृद्धि हुई है नहीं होगा, केवल एक एक बार शून्य अंतरिक्ष आधार उत्पन्न होने के बाद सरल मैट्रिक्स-वेक्टर गुणा आवश्यक है। यदि आपका मैट्रिक्स बहुत बड़ा है (और मैट्रिक्स लगभग पूर्ण रैंक) कि शून्य पर कॉल विफल हो जाएगा, तो आपको और अधिक काम करने की आवश्यकता होगी। हालांकि, जब तक मैट्रिक्स में बहुत अधिक कॉलम नहीं होते हैं, तब तक n = 4096 अत्यधिक बड़ा नहीं होता है।

एक विकल्प अगर नल बहुत अधिक है तो एसवीडीएस के लिए एक कॉल है, जो उन एकवचन वैक्टर को खोजने के लिए अनिवार्य रूप से शून्य हैं। ये नलस्पेस आधार बनेंगे जो हमें चाहिए।

+0

धन्यवाद! यही मैंने कोशिश की, सिवाय इसके कि मेरा LinAlg-fu आपके जितना मजबूत नहीं है। – Jonas

+0

धन्यवाद, बार-बार हल करने के लिए यह बहुत अच्छी सलाह है। –

2

मैं स्पैर मैट्रिक्स के लिए sprank का उपयोग करूंगा। इसे देखें, यह किसी भी अन्य विधि से तेज हो सकता है।

संपादित करें: जैसा कि @IanHincks द्वारा सही ढंग से इंगित किया गया है, यह रैंक नहीं है। मैं यहां जवाब छोड़ रहा हूं, बस अगर किसी और को भविष्य में इसकी आवश्यकता होगी।

+1

यह निश्चित रूप से बहुत तेज है, लेकिन यह रैंक को वापस नहीं करता है, केवल रैंक पर एक बाध्य (दस्तावेज़ीकरण इसे संरचनात्मक रैंक कहते हैं)। –

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

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