2012-09-28 21 views
6

के लिए मैटलैब को अनुकूलित करने के लिए मेरे पास कोड के लिए यह निम्न लूप है (जो हिस्टोग्राम की गणना करता है)। मैं मटकाब में लिख रहा हूं। जैसा कि मैं मटकाब के लिए नया हूं, मुझे ऐसा करने के लिए किसी भी तेज तरीके से नहीं पता है। मैं वर्तमान मेंलूप

for i=1:size(b) 
    a(b(i)) = a(b(i)) + 1; 
end 

क्या ऐसा करने के लिए कोई तेज़ तरीका है, अधिमानतः उन लोगों को जिन्हें लूप की आवश्यकता नहीं है?

+2

सामान्य टिप्पणी: [लंबाई] ('size' तुम अब क्या कर रहे हैं के लिए सही कार्य नहीं है, बल्कि का उपयोग http://www.mathworks.nl/help/matlab/ref/length.html) या [numel] (http://www.mathworks.nl/help/matlab/ref/numel.html)। –

+2

विचार यह है कि फॉर-लूप अक्षम/धीमी हैं और यदि संभव हो तो प्रतिस्थापित किया जाना चाहिए असंभव है। भले ही आप इस कोड को तेज़ी से कुछ बदल सकते हैं, तो आप शायद एक सेकंड के केवल एक अंश को बचाएंगे। यह कोड अनुकूलन का स्तर नहीं है जिसके बारे में आपको चिंतित होना चाहिए। – Kavka

+0

@ क्वका इस प्रकार के लूप के बारे में चिंता करते हुए, मैं सहमत होगा। बड़े मैट्रिस में हेरफेर करने वाले लूप के लिए एक और जटिल वेक्टरिंग के लायक होगा, है ना? मैटलैब को मैट्रिस के साथ काम करने के लिए डिज़ाइन किया गया था - इसके सभी मैट्रिक्स ऑपरेशंस को अनुकूलित किया जाना चाहिए। – Derek

उत्तर

9

आप इसे a(b) = a(b) + 1 द्वारा आसानी से सदिश कर सकते हैं। चेक निम्नलिखित:

>> a = [1 2 3 4]; 
>> b = [2 4]; %# indices to modify. Be sure that they are in bounds. 
>> a(b) = a(b) + 1 

a = 

    1  3  3  5 

आपकी कई बार कुछ सूचकांकों का उपयोग करते हैं, तो accumarray इस प्रकार में मदद मिलेगी:

>> a = [1 2 3 4]; 
>> b = [2 4 2]; 
>> a = accumarray([1:numel(a) b].',[a ones(size(b))])' 

a = 

    1  4  3  5 

वैकल्पिक रूप से, आप का उपयोग कर सकते हैं:

>> a = [1 2 3 4]; 
>> b = [2 4 2]; 
>> b = accumarray(b.',ones(size(b))); 
>> a(nzIndex) = a(nzIndex) + b(nzIndex)' 

a = 

    1  4  3  5 

के लिए this nice answer यहाँ देखें आगे की जानकारी।

+0

मेरे मामले में बी [2 4 2] हो सकता है, ताकि मुझे दो (2) दो बार बढ़ाना पड़े। यह विधि केवल एक बार (2) अपडेट करती है। – anirudh

+0

मैंने तदनुसार प्रश्न अपडेट किया है। – petrichor

1

यदि a और b दोनों वेक्टर हैं, तो यह काम करना चाहिए।

a = 1:100; 
b = 100:-1:1; 

a(b) = a(b) + 1;