2012-05-09 22 views
9

के विपरीत की गणना करना मैं सी ++ में एक बहुत बड़े मैट्रिक्स (11300x21500) के विपरीत की गणना करने की कोशिश कर रहा हूं। अब तक मैंने ईजिन और अर्माडिलो पुस्तकालयों की कोशिश की है लेकिन दोनों शुरुआती चरण में विफल रहे और कहा कि पर्याप्त स्मृति नहीं है। क्या इस स्थिति को दूर करने का कोई तरीका हो सकता है?एक बहुत बड़े मैट्रिक्स

अग्रिम

पी.एस
धन्यवाद मैं 21500x21500 को मैट्रिक्स के आकार ठीक हो जानी चाहिए। चूंकि UmNyobe ने सुझाव दिया, यह एक वर्ग मैट्रिक्स नहीं है। यह वास्तव में अवलोकन मैट्रिक्स, एक्स है, और मैं गणना करने के लिए (एक्सटीएक्स) कोशिश कर रहा हूँ -1

मैं एक 8GB स्मृति (एक 64 बिट प्रणाली में) है, लेकिन मैं मुझे नहीं लगता कि मैं इस स्मृति की सभी जगहों का उपयोग कर रहा हूं। कार्य प्रबंधक दिखाता है कि त्रुटि के समय स्मृति उपयोग 1 जीबी है। हो सकता है कि विंडोज 7 में एक ओएस कमांड है जो एक एप्लीकेशन बंद कर देता है जब इसकी मेमोरी उपयोग 1 जीबी से अधिक हो जाती है।

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

एक और बात: अवलोकन मैट्रिक्स एक्स की प्रत्येक पंक्ति में अधिकांश कॉलम शून्य हैं। इनवर्टरिंग ऑपरेशन में मेमोरी उपयोग को सीमित करने के लिए इसका लाभ उठाने का कोई तरीका हो सकता है?

+3

आपके आयाम बराबर क्यों नहीं हैं ?? – UmNyobe

+2

उस मैट्रिक्स में 4 जीबी या 2 जीबी डेटा है जो इस पर निर्भर करता है कि आपके पास 4- या 8-बाइट मैट्रिक्स प्रविष्टियां हैं या नहीं। क्या आप 32-बिट मशीन पर हैं? –

+0

स्टीव मैं स्मृति के बारे में पोस्ट करने जा रहा था, आपको इसे अधिक विस्तार से लिखना चाहिए जैसा आपने पहले उल्लेख किया था। – UmNyobe

उत्तर

5

आप एक गैर स्क्वायर मैट्रिक्स को उलटा नहीं कर सकते हैं।

http://en.wikipedia.org/wiki/Invertible_matrix

+2

भले ही यह वर्ग था, स्मृति अभी भी 32-बिट हार्डवेयर –

+0

पर कोई फर्क नहीं पड़ता है, मैंने विनिर्देश को सही किया है, यह 21000x21000 डिमेंशन का स्क्वायर मैट्रिक्स है। –

+2

मुझे लगता है कि वह एक मूर-पेनरोस छद्म संकेतक चाहता है, जिसे आप गैर स्क्वायर मैट्रिक्स पर ले सकते हैं। –

6

मैट्रिक्स जाना चाहिए वर्ग है, क्या आप शायद के लिए देख रहे एक में जगह मैट्रिक्स उलट एल्गोरिथ्म है।

आपको this देखें।

4

पूर्णांक के (11300 x 11300) मैट्रिक्स (32 बिट) मान लिया जाये, तो आप

4*(11300^2)/(1024^3) = 0.4757 GB 

आप डबल परिशुद्धता का उपयोग कर रहे हैं तो यह संख्या दोगुनी है।

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

तो स्ट्रैसेन या गाऊशियन के साथ इस आकार के डबल-आधारित मैट्रिक्स को अपनाने से आपको 1.9 जीबी खर्च होंगे।

+0

... तो? मुझे ठीक लगता है। –

+0

तो उसे जिस मशीन पर काम कर रहा है उसका विवरण प्रदान करने की आवश्यकता है। उदाहरण के लिए वह 32 बिट मशीन पर 21500x21500 को उलटा नहीं कर पाएगा ... – UmNyobe

+1

इनपुट के लिए धन्यवाद। मेरी मशीन विनिर्देश के रूप में, मेरे पास 8 जीबी मेमोरी है (64 बिट सिस्टम में)। लेकिन जहां तक ​​मैं टास्क मैनेजर के साथ मेमोरी उपयोग का ट्रैक रख सकता हूं, तब तक उपयोग की गई मेमोरी 1 जीबी होने पर विंडोज़ एप्लिकेशन को बंद कर देती है। कम से कम, यह वह राशि है जो कार्य प्रबंधक दिखाती है। और यह वास्तव में उलटा लेने से पहले होता है। एप्लिकेशन मैट्रिक्स के प्रारंभिक चरण में त्रुटि देता है –

1

मैं एक और समाधान प्रस्तावित करना चाहता हूं, जो केवल तभी काम करता है जब आप मैट्रिक्स के विपरीत में रुचि रखते हैं लेकिन वेक्टर के विपरीत के उत्पाद में रुचि नहीं रखते हैं। उदाहरण के लिए, मान लें कि आप अपने व्यस्त समय के उत्पाद को वेक्टर v, यानी w := (X^T X)^{-1} v ढूंढना चाहते हैं। इस मामले में, आप वास्तव में समस्या

Find w such that (X^T X) w = v 

के लिए एक समाधान के लिए देख रहे पुनरावृत्ति एल्गोरिदम का उपयोग करना, यहX inverting बिना w दिया X और उपरोक्त समीकरण में v खोजने के लिए संभव है। मेरे दिमाग में आने वाली एक संभावना Method of Conjugate Gradients का उपयोग कर रही है।यह एल्गोरिदम लगभग 10 लाइनों में कार्यान्वित किया जा सकता है और केवल (X^T X) y को दिए गए वेक्टर y के साथ उत्पाद की गणना करने में सक्षम होना आवश्यक है। हमारे मामले में, यह दो चरणों में भी किया जा सकता है, यानी z := X y और दूसरी चरण X^T z पर गणना करें, जो अंतरिक्ष को सहेज लेगा क्योंकि आपको उत्पाद X^T X को स्टोर करने की आवश्यकता नहीं है।

0

हालांकि आप 64-बिट मशीन पर अपने प्रोग्राम को संकलित कर रहे हैं, आपको यह भी सुनिश्चित करना चाहिए कि आप सही 64-बिट पुस्तकालयों का उपयोग कर रहे हैं। अन्यथा, प्रोग्राम 32-बिट में संकलित किया जा सकता है और आपको अभी भी वही स्मृति समस्याएं मिलेंगी।

उलटा की गणना के लिए, ओपनसीवी के व्यस्त कार्य में मदद मिल सकती है। DECOMP_SVD उलटा उपयोग करना सुनिश्चित करें, क्योंकि मुझे यह लगभग एकवचन मैट्रिक्स के साथ अधिक प्रभावी पाया गया है।

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