2011-08-04 24 views
6

मैं निम्न समीकरण scipy का विरल पैकेज का उपयोग लागू करने के लिए कोशिश कर रहा हूँ विरल मैट्रिक्स पर बाहरी उत्पादों का योग:प्रदर्शन

W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ... 

जहां x & y एक nxm csc_matrix हैं। असल में मैं वाई के प्रत्येक कॉल द्वारा एक्स के प्रत्येक को गुणा करने की कोशिश कर रहा हूं और परिणामी एनएक्सएन मैट्रिक्स को एक साथ जोड़ता हूं।

c = sparse.csc_matrix((n, n)) 
    for i in xrange(0,m): 
     tmp = bam.id2sym_thal[:,i] * bam.id2sym_cort[:,i].T 
     minimum(tmp.data,ones_like(tmp.data),tmp.data) 
     maximum(tmp.data,ones_like(tmp.data),tmp.data) 

     c = c + tmp 

इस कार्यान्वयन में निम्न समस्याएं हैं:

  1. मेमोरी उपयोग में विस्फोट हो रहा है मैं तो सभी गैर शून्य तत्व 1.

    यह मेरा वर्तमान कार्यान्वयन है बनाना चाहते हैं। जैसा कि मैं इसे समझता हूं, स्मृति को केवल कम होना चाहिए क्योंकि सी कम स्पैस हो जाता है, लेकिन मैं देख रहा हूं कि लूप एक = 10,000, एम = 100,000 (वाई की प्रत्येक पंक्ति में केवल 60 गैर- शून्य तत्व)।

  2. मैं एक पायथन लूप का उपयोग कर रहा हूं जो बहुत ही कुशल नहीं है।

मेरा प्रश्न: क्या ऐसा करने का कोई बेहतर तरीका है? स्मृति उपयोग को नियंत्रित करना मेरी पहली चिंता है, लेकिन इसे तेज़ी से बनाना बहुत अच्छा होगा!

धन्यवाद!

+0

'x [:, i] 'आपको' x' का ith कॉलम देने वाला है, पंक्ति – JoshAdel

+0

@ जोशएडेल नहीं: आप सही हैं, मैं गलत हूं, मेरा कहना है कि एक्स के कॉलम को एक्स के कॉलम से गुणा करें y। मैंने सवाल अपडेट किया है। धन्यवाद! – RussellM

+0

आपका समीकरण बाहरी उत्पादों का एक आंतरिक उत्पाद है, न कि बाहरी उत्पादों। आपको 'y' के कॉलम को ट्रांसफर करना होगा, न कि' x'। (या तो वह, या शीर्षक गलत है।) –

उत्तर

3

ध्यान दें कि ढंग आप का वर्णन में बाहरी उत्पादों की राशि बस दो मैट्रिक्स को एक साथ जोड़ रूप में ही है । दूसरे शब्दों में,

sum_i X[:,i]*Y[:,i].T == X*Y.T 

तो बस मैट्रिक्स को एक साथ गुणा करें।

Z = X*Y.T 

n के लिए = 10000 और मीटर = 100000 और जहां प्रत्येक स्तंभ दोनों एक्स और वाई में एक अशून्य तत्व है, यह अपने लैपटॉप पर लगभग तुरंत गणना करता है।

+1

और अंतिम चरण nonzero तत्वों को 1 पर सेट करना होगा, जैसे Z.data [:] = 1. अल कठिन यह वास्तव में स्पष्ट नहीं है, अगर यह ओपी की तलाश में था। धन्यवाद – eat

+0

यह वह समाधान है जिसके साथ मैं गया था। क्या यह सभी मैट्रिक्स के लिए सच है या यह इस बात पर निर्भर है कि मेरे वैक्टर कितने स्पैस हैं? मैंने खाने की सलाह निभाई और सभी nonzero तत्वों को एक साथ भी सेट किया। धन्यवाद! – RussellM

+0

चलिए 'एक्स = [x1 x2 ... xk]' जहां 'xi' n-by-k मैट्रिक्स एक्स में i^th कॉलम है।चलो 'वाई = [वाई 1 वाई 2 ... yk]' जहां 'yi' i-th कॉलम एम-बाय-के मैट्रिक्स वाई में है। फिर * किसी * * एक्स 'और' वाई',' Z = X के लिए * वाईटी = sum_i xi * yi.T', जहां 'Z' n-by-m है। –

0

स्मृति और प्रदर्शन के मामले में, यह Cython का उपयोग करने के लिए एक प्रमुख उम्मीदवार हो सकता है।

निम्नलिखित कागज विरल scipy matricies साथ इसके उपयोग का वर्णन करने का एक वर्ग है:

http://folk.uio.no/dagss/cython_cise.pdf

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