फास्ट वही है जो आपको चिंता करना चाहिए, जरूरी नहीं कि पूर्ण वेक्टरनाइज़ेशन। Matlab के हाल के संस्करण बहुत कुशलतापूर्वक लूप को संभालने के बारे में समझदार हैं। यदि कुछ व्यक्त करने का एक कॉम्पैक्ट वेक्टरीकृत तरीका है, तो यह आमतौर पर तेज़ होता है, लेकिन लूप को हमेशा (हमेशा) डरना नहीं चाहिए जैसा कि वे होते थे।
clc
A = rand(5000)>0.5;
A(1,find(sum(A,1)==0)) = 1; % make sure there is at least one match
% Slow because it is doing too much work
tic;[B,I1]=max(cumsum(A));toc
% Fast because FIND is fast and it runs the inner loop
tic;
I3=zeros(1,5000);
for i=1:5000
I3(i) = find(A(:,i),1,'last');
end
toc;
assert(all(I1==I3));
% Even faster because the JIT in Matlab is smart enough now
tic;
I2=zeros(1,5000);
for i=1:5000
I2(i) = 0;
for j=5000:-1:1
if A(j,i)
I2(i) = j;
break;
end
end
end
toc;
assert(all(I1==I2));
R2008a, विंडोज़, x64 पर, cumsum संस्करण 0.9 सेकंड लेता है। लूप और खोज संस्करण 0.02 सेकंड लेता है। डबल लूप संस्करण में केवल 0.001 सेकेंड लगते हैं।
संपादित करें: कौन सा सबसे तेज़ डेटा पर निर्भर करता है। जब आप 0.5 से 0.999 बदलते हैं तो डबल-लूप 0.05 सेकेंड लेता है (क्योंकि ब्रेक को हिट करने में अधिक समय लगता है; औसत पर)। cumsum और लूप & पाते हैं कार्यान्वयन में अधिक लगातार गति है।
संपादित करें 2: gnovice का फ्लिपड समाधान चालाक है। दुर्भाग्यवश, मेरी टेस्ट मशीन पर 0.1 सेकंड लगते हैं, इसलिए यह cumsum से बहुत तेज है, लेकिन looped संस्करणों की तुलना में धीमी है।
स्रोत
2009-05-06 21:52:53
चालाक विचार। दुर्भाग्यवश, यह लूप और ढूंढने से लगभग 5x धीमी है। –
यह थोड़ी सी नतीजा है जो मैंने अपेक्षित था: क्यूसम से तेज लेकिन लूपिंग से अभी भी धीमा है ... हालांकि यह अभी भी आकार के आकार और भरने के अंश पर निर्भर है (जिसे ओपी वास्तव में परिभाषित नहीं किया गया था)। – gnovice