2009-07-18 7 views
6

का उपयोग किए बिना एक मैट्रिक्स एम और स्तंभों मैं और जम्मू में संग्रहीत सबस्क्रिप्ट का एक सेट पर विचार करें। मुझे उन्हें & जे द्वारा निर्दिष्ट रैखिक सूचकांक में परिवर्तित किए बिना तत्वों तक पहुंचने की आवश्यकता है (यानी sub2ind का उपयोग कर)। जैसेएक्सेस करना सबस्क्रिप्ट का उपयोग कर मूल्यों sub2ind

M = [1 2 3;4 5 6;7 8 9]; 
I = [1 1 1]; 
J = [1 2 3]; 

VALS = [1 2 3]; 

इसके अलावा, कर निम्नलिखित संभव नहीं है के बाद से मैं & जम्मू huge हैं:

VALS = diag(M(I,J)); 

और प्रदर्शन के लिए, इस नहीं मैं के लिए क्या देख रहा हूँ है,

VALS = M(sub2ind(size(M),I,J)); 

अनिवार्य रूप से sub2ind में बहुत समय लग रहा है और अभी मैं इन तत्वों को एक्सेस करने के तरीकों की तलाश में हूं सूचकांक में सबस्क्रिप्ट को परिवर्तित नहीं कर रहा है। किसी भी अन्य तरीके से व्यवहार्य है जब तक कि यह sub2ind का उपयोग कर विधि से तेज़ है।

उत्तर

7

यह SUB2IND का उपयोग कर से अधिक तेजी से हो सकता है:

[r,c] = size(M); % Get the size of M 
vals = M(I+r.*(J-1)); % Compute a linear index with vector operations 
+1

मैटलैब के हाल के संस्करणों पर, यह वास्तव में एक बड़ी स्मृति आवंटन से बचने के सकता है, क्योंकि मैटलैब आमतौर पर बहुत चालाक बड़े temporaries बनाए बिना मध्यवर्ती परिणाम की गणना करने के लिए है, यानी यह इंडेक्सिंग और असाइनमेंट करेगा जिस तरह से कोई व्यक्ति सी –

+0

में ऐसा करेगा, यह वास्तव में वही है जो सीमाओं को छोड़कर 'sub2ind' करता है। स्पीड लाभ मुख्य रूप से कॉल को 'मिनट' और 'अधिकतम' तक छोड़ने से आता है, जो कि सीमा शुल्क सूचकांक पर प्रदर्शन करते हैं। श्री फूज़ ने जो लिखा, उसके विपरीत मैंने कुछ परीक्षणों में आर2015 बी में कुछ विशाल 'आई' और' जे 'के साथ प्रदर्शन किया है, यह रैखिक सूचकांक की गणना करने के लिए थोड़ा अधिक कुशल साबित हुआ है जैसे' ind = I + r * * (जे -1) 'और फिर' एम (इंड) ', एक एम में जाने के बजाय' एम (आई + आर। * (जे -1)) 'की गणना करने के बजाय। –

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