2012-09-28 18 views
6

Bir kod için aşağıdaki döngüye sahibim (bu histogramları hesaplar). Matlab'da yazıyorum. Matlab'a yeni olduğum için bunu yapmak için daha hızlı yöntemler bilmiyorum. Şu anda tercihen döngü gerekmez olanlar Bunu yapmak için herhangi bir hızlı yöntemler var mıdır Döngü için en iyileştirme matlabı

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

yazıyorum?

+2

genel yorum: 'size' yapıyorsun şimdi ne doğru işlev değil, daha ziyade kullanmak [uzunluk] (http://www.mathworks.nl/help/matlab/ref/length.html) veya [sayı] (http://www.mathworks.nl/help/matlab/ref/numel.html). –

+2

For-döngülerinin verimsiz/yavaş olduğu ve mümkünse değiştirilmesi gerektiği fikri asılsızdır. Bu kodu daha hızlı bir şeyle değiştirebilmenize rağmen, muhtemelen saniyenin yalnızca bir kısmını kaydedersiniz. Endişelenmeniz gereken kod optimizasyonu seviyesi bu değil. – Kavka

+0

@Kavka Bu tür bir döngü ile ilgili olarak hemfikir olurdum. Büyük matrisleri manipüle eden daha karmaşık bir döngü, vektörelleştirmeye değecektir, değil mi? Matlab Matrislerle çalışmak üzere tasarlandı - tüm matris işlemlerinin optimize edilmesi gerekiyor. – Derek

cevap

9

Bunu, a(b) = a(b) + 1 ile basitleştirebilirsiniz. Kontrol edin:

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

a = 

    1  4  3  5 

Alternatif kullanabilirsiniz:

>> 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 

için this nice answer buraya bakınız birden fazla kez bazı endeksi kullanmak aşağıdaki gibi

>> 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 

ardından accumarray yardımcı olacaktır daha fazla ayrıntı.

+0

Benim durumumda b [2 4 2] olabilir, böylece bir (2) değerini iki kez artırmam gerekir. Bu yöntem bir (2) sadece bir kez günceller. – anirudh

+0

Soruyu buna göre güncelledim. – petrichor

1

Her ikisi de a ve b ise, bu işe yaramalıdır.

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

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