2010-11-15 14 views
10

मैं उम्बास :: संपीड़ित मैट्रिक्स का उपयोग कर रहा हूं ताकि UMFPACK, एक स्पैस रैखिक सॉल्वर के साथ काम किया जा सके। चूंकि मैं सिमुलेशन कर रहा हूं, इसलिए प्रत्येक बार रैखिक प्रणाली का निर्माण थोड़ा अलग तरीके से किया जाता है जिसमें गुणांक मैट्रिक्स और कुछ स्पैर मैट्रिक्स गुणाओं को बढ़ाना/घटाना शामिल हो सकता है। रैखिक प्रणाली का स्तर लगभग 25k है।क्या बूस्ट में compress_matrix को गतिशील रूप से बदलने का कोई प्रभावी तरीका है?

यहां तक ​​कि UMFPACK के साथ काम करने के लिए बढ़ावा देने के लिए बाध्यकारी पैच भी है, मुझे समय-समय पर मैट्रिक्स को बदलने की ज़रूरत है, कभी-कभी यहां तक ​​कि गैर-शून्य मानों की संख्या का पता लगाना भी समय लेने वाला होगा (आदर्श रूप में, मेरे पास है जब मैं मैट्रिक्स प्रारंभ करता हूं तो गैर-शून्य मानों की संख्या देने के लिए)। साथ ही, मैं कॉलम/पंक्तियों को गतिशील रूप से जोड़ने के लिए ublas :: श्रेणी का उपयोग करता हूं।

तो मेरा सवाल है: क्या ऐसा करने का कोई प्रभावी तरीका है? अभी यह मेरे लिए बहुत धीमा है। आयाम के साथ एक मैट्रिक्स को ट्रांसफर करना जैसे कि 15k की लागत लगभग 6s है और लगभग 12k पंक्तियों को जोड़ना तेज़ है (क्योंकि मुझे लगता है कि यह एक पंक्ति-प्रमुख मैट्रिक्स है), लेकिन मैट्रिक्स में समान संख्या में कॉलम जोड़ना 20s तक हो सकता है (मुझे लगता है कि इसके लिए उपर्युक्त कारण, इसलिए मैंने कॉलम-प्रमुख मैट्रिक्स का भी उपयोग किया, कुल समय आवश्यक होगा)।

किंडा यहां बेताब हो रही है। कोई सुझाव स्वागत है।

चीयर्स।

+0

चूंकि मेरे पास लगभग 30 विचार थे लेकिन कोई जवाब नहीं था, मुझे लगता है कि शायद मेरा प्रश्न बहुत स्पष्ट नहीं है। तो यहां कुछ विवरण दिए गए हैं। – He01

+0

चूंकि मैं सिमुलेशन कर रहा हूं, हर बार चरण के लिए, मैंने एक रैखिक प्रणाली इकट्ठा की है और इसे हल किया है जो मूल रूप से केवल एक्स = बी है। हालांकि, गुणांक मैट्रिक्स ए आमतौर पर तीन matrices द्वारा रचित है। एक वजन मैट्रिक्स, क्रमशः मुलायम बाधाओं और कठोर बाधाओं के लिए दो गुणांक matrices जो precomputed नहीं किया जा सकता है। (अगली टिप्पणी देखें) – He01

+0

रैखिक प्रणाली को हल करने के कारण कम से कम वर्ग अर्थ में एक वर्गबद्ध कार्य को कम करने का परिणाम है, मुझे एक मैट्रिक्स-मैट्रिक्स गुणा करना है ताकि मैट्रिक्स टी और मैट्रिक्स-वेक्टर गुणा को एकीकृत करने के लिए बी बनाने के लिए किया जा सके। नरम बाधा रैखिक प्रणाली मैट्रिक्स। तो मुझे ए को बनाने के लिए नीचे की कठोर बाधा मैट्रिक्स को नीचे और टी के दाएं को जोड़ना होगा। आखिरकार, ए और बी के बाद, मैं उन्हें यूएमएफपैक में इनपुट कर सकता हूं। (अगली टिप्पणी देखें) – He01

उत्तर

0

आप प्रत्येक बार मैट्रिक्स कैसे बनाते हैं, क्या आप किसी प्रकार के विभिन्न सॉफ़्टवेयर से इंटरफेसिंग कर रहे हैं। इस मामले में, इंटरफेसिंग पर बिताए गए समय का अनुमान है कि मुझे बहुत कम लगता है।

और आप यूब्लैस के लिए -DNDEBUG ध्वज का उपयोग करते हैं, है ना?

मैं अभी भी यकीन है कि समस्या क्या है नहीं कर रहा हूँ ...

बेस्ट, Umut

+0

हाय उमट, आपके ध्यान के लिए धन्यवाद, मैं इसे और अधिक परीक्षण करूंगा और यहां एक पूरी तस्वीर देने की कोशिश करूंगा। – He01

1

मैं अपने संकुल से परिचित नहीं हूँ, लेकिन तुम क्यों (आदर्श) गैर की संख्या स्पष्ट करना पड़ता है आपके मैट्रिक्स में शून्य तत्व? क्या आप अधिक निर्दिष्ट नहीं कर सकते हैं और फिर आकार में कमी कर सकते हैं?

मैं भी उलझन में हूं कि स्तंभ जोड़ने के लिए इतना खर्च क्यों करना चाहिए। एक स्पैस प्रारूप इसे संभालने में सक्षम होना चाहिए। मैं निष्कर्ष निकालूंगा कि दो चीजों में से एक हो रहा है। या तो आपका मैट्रिक्स किसी भी तरह से वापस परिवर्तित होने से पहले एक गैर-स्पैस मैट्रिक्स में परिवर्तित किया जा रहा है (किसी भी सभ्य स्पैर मैट्रिक्स पैकेज में भयानक और असंभव प्रतीत होता है) या सम्मिलन के लिए कोड वर्गबद्ध है, क्योंकि यह बार-बार मूल्यों को सम्मिलित करता है, प्रत्येक दूसरे को स्थानांतरित करता है पहर।

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

इसके अलावा, यदि मैट्रिक्स 25k प्रविष्टियों के क्रम में है, तो इसका प्रतिलिपि बनाने या इसे ट्रांसपोज़ करने का कोई उचित उत्तर नहीं है, इसे कुछ मिलीसेकंड से अधिक लेना चाहिए। मुझे लगता है कि आपको इस समस्या के अलग-अलग टुकड़ों को बेंचमार्क करना होगा और वास्तव में यह तय करना होगा कि समय कहां जा रहा है, जब तक कॉलम जोड़ने के लिए उपरोक्त समाधान आपकी समस्या हल नहीं करता है।

+0

धन्यवाद डोव, तब से मैं बहुत व्यस्त हूं, थोड़ी देर के लिए समस्या लटका दें। मैं टुकड़े से टुकड़ा, अपने सुझावों का प्रयास करेंगे। – He01

+0

हाय डोव, ट्रांसपोजिंग भाग के लिए, मैंने एक पंक्ति-प्रमुख स्पैर मैट्रिक्स को स्थानांतरित करने की कोशिश की और इसे एक पंक्ति-प्रमुख स्पैर मैट्रिक्स को असाइन करने की कोशिश की, यह एक कॉलम-प्रमुख स्पैर मैट्रिक्स को असाइन करने की तुलना में बहुत धीमी है। मुझे लगता है कि किसी भी तरह से ट्रांसपोज़िंग करते समय आंतरिक प्रतिनिधित्व भी बदला जा सकता है। – He01

0

मूल्यों के कई अलग-अलग सेटों में शामिल होने से ए बनाने के बजाय, क्या आपने उन्हें अलग-अलग मैट्रिक्स में रखने और अपने स्वयं के समग्र सॉल्वर बनाने के लिए मौजूदा सॉल्वर रूटीन का उपयोग करने पर विचार किया है? असल में, आप एक घटक मैट्रिक्स के लिए उचित अपघटन (LU, QR, जो कुछ भी) लागू करेंगे, बाद के घटकों पर संबंधित अद्यतन/परिवर्तन चलाएं, और प्रत्येक अनुवर्ती मैट्रिक्स के लिए दोहराएं।फिर आप अपने समाधान की गणना करने के लिए फैक्टर घटक मैट्रिस का उपयोग करेंगे। यह स्पष्ट नहीं है कि जिस लाइब्रेरी के साथ आप काम कर रहे हैं, वह सीधे इसका समर्थन करेगा, या फिर आपको कुछ संख्यात्मक संख्याओं को स्वयं लिखना होगा या नहीं।

0

क्या आपने इस तरह की समस्या के लिए ईजिन की कोशिश की? हाल ही में उन्होंने स्पैर मैट्रिस समर्थन पूरा किया।

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

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