2013-06-20 10 views
5

में तत्व ढूंढने के लिए कुशल विधि मैं जानना चाहूंगा कि कोड के दिए गए टुकड़े में बाधा का इलाज कैसे किया जा सकता है।MATLAB मैट्रिक्स

%% Points is an Nx3 matrix having the coordinates of N points where N ~ 10^6 
Z = points(:,3) 
listZ = (Z >= a & Z < b); % Bottleneck 
np = sum(listZ); % For later usage 
slice = points(listZ,:); 

वर्तमान में N ~ 10^6, np ~ 1000 और number of calls to this part of code = 1000 के लिए, टोंटी बयान लगभग 10 सेकंड में कुल ले जा रहा है, जो मेरे कोड के बाकी की तुलना में समय का एक बड़ा हिस्सा है।

Profiling Results

केवल अनुक्रमण बयान के लिए एक नमूना कोड के कुछ और स्क्रीनशॉट के रूप में @EitanT द्वारा अनुरोध

Profiling for sample code Profiling for sample code

+1

आप यकीन है कि यह है कर रहे हैं बाधा (क्या आप प्रोफाइलिंग परिणाम दिखा सकते हैं)? और वैसे भी 'num_calls' क्या है? –

+0

@EitanT हां मैंने इसे MATLAB प्रोफाइलर के माध्यम से स्वयं जांच लिया है और यह कथन वास्तव में बाधा – OrangeRind

+0

@EitanT है मैंने प्रोफाइलिंग परिणाम – OrangeRind

उत्तर

8

तो एक तरफ समानता महत्वपूर्ण है कि आप एक तरफा तुलना करने के लिए इसे reformulate कर सकते हैं नहीं है और यह तेजी से परिमाण के एक आदेश हो जाता है:

Z = rand(1e6,3); 
a=0.5; b=0.6; 
c=(a+b)/2; 
d=abs(a-b)/2; 
tic 
for k=1:100, 
    listZ1 = (Z >= a & Z < b); % Bottleneck 
end 
toc 

tic 
for k=1:100, 
    listZ2 = (abs(Z-c)<d); 
end 
toc 

isequal(listZ1, listZ2) 

रिटर्न

Elapsed time is 5.567460 seconds. 
Elapsed time is 0.625646 seconds. 

ans = 

    1 
+1

आह! इससे मुझे [कुछ अतीत में पूछा गया] याद दिलाता है (http://stackoverflow.com/questions/12137233/matlab-performance-comparison-lower-than-arithmetic)। दरअसल, मुझे लगता है कि यह जाने का रास्ता है। –

+0

यह अच्छा है! हालांकि मैं वास्तविक कार्यक्रम में परिमाण के क्रम से थोड़ा कम हो रहा हूं, शायद शेष कोड की जटिलता के कारण - लेकिन फिर भी मुझे लगता है कि कुछ और किया जा सकता है। – OrangeRind

+2

[हाल ही में सी प्रोग्रामिंग प्रश्न] (http://stackoverflow.com/a/17095534/1165522) के स्वीकृत उत्तर को भी देखें। – horchler

1

कुछ इस तरह कर रही प्रयास करें:

for i = 1:1000 
    x = (a >= 0.5); 
    x = (x < 0.6); 
end 

मैंने इसे तेजी से पाया:

for i = 1:1000 
    x = (a >= 0.5 & a < 0.6); 
end 

के बारे में 4 सेकंड द्वारा:

Elapsed time is 0.985001 seconds. (first one) 
Elapsed time is 4.888243 seconds. (second one) 

मुझे लगता है कि अपने धीमा का कारण तत्व बुद्धिमान & ऑपरेशन है।

+0

कृपया प्रश्न को अधिक सावधानी से पढ़ें। :) – OrangeRind

+0

हां मैं देखता हूं कि अब आपका क्या मतलब है। – KronoS

+0

@OrangeRind अद्यतन उत्तर देखें। – KronoS

3

सबसे खराब स्थिति यह मानते हुए:

  • तत्व के लिहाज से & शॉर्ट सर्किट नहीं है आंतरिक
  • तुलना एकल पिरोया

आप में 2*1e6*1e3 = 2e9 तुलना कर रहे हैं ~ 10 सेकंड की होती है । प्रति ~ 200 मिलियन तुलना प्रति सेकंड (~ 200 एमएफएलओपीएस) है।

ध्यान दें कि आप कुछ 1.7 GFLops on a single core कर सकते हैं, यह वास्तव में कम लगता है।

क्या आप विंडोज 7 चला रहे हैं? यदि हां, तो क्या आपने अपनी पावर सेटिंग्स की जांच की है? आप मोबाइल प्रोसेसर पर हैं, इसलिए मैं उम्मीद करता हूं कि डिफ़ॉल्ट रूप से, कुछ कम बिजली की खपत योजना प्रभावी रूप से होगी। यह विंडोज़ को प्रोसेसिंग की गति को स्केल करने की इजाजत देता है, इसलिए ... इसे जांचें।

इसके अलावा .... मुझे वास्तव में कोई सुराग नहीं है।

+0

वहां ध्यान देने योग्य अच्छा बिंदु - लेकिन मैंने बिजली योजना के बारे में निश्चित किया है - और गणना के दौरान टर्बो बूस्ट भी लात मार रहा है क्योंकि यह एकल थ्रेडेड चल रहा है। मैं geekbench के माध्यम से अपने सीपीयू के थ्रूपुट की जांच करूँगा और आपको बता दूंगा। – OrangeRind