2012-09-28 13 views
6

Ich habe diese folgende Schleife für einen Code (der die Histogramme berechnet). Ich schreibe in Matlab. Da ich neu bei Matlab bin, kenne ich keine schnelleren Methoden, dies zu tun. Ich schreibe zur ZeitOptimierung Matlab für Schleife

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

Gibt es schnellere Methoden, dies zu tun, vorzugsweise solche, die nicht die for-Schleife erfordern?

+2

allgemeine Bemerkung: 'size' ist nicht die richtige Funktion für das, was Sie jetzt tun, eher mit [Länge] (http://www.mathworks.nl/help/matlab/ref/length.html) oder [numel] (http://www.mathworks.nl/help/matlab/ref/numel.html). –

+2

Die Idee, dass For-Schleifen ineffizient/langsam sind und wenn möglich ersetzt werden sollten, ist unbegründet. Obwohl Sie diesen Code durch etwas schnelleres ersetzen könnten, würden Sie wahrscheinlich nur einen Bruchteil einer Sekunde sparen. Dies ist nicht das Niveau der Codeoptimierung, um das Sie sich sorgen sollten. – Kavka

+0

@Kavka Über diese Art von for-Schleife würde ich zustimmen. Eine komplexere for-Schleife, die große Matrizen manipuliert, wäre eine Vektorisierung wert, oder? Matlab wurde entwickelt, um mit Matrizen zu arbeiten - alle Matrixoperationen sollen optimiert werden. – Derek

Antwort

9

Sie können es einfach durch a(b) = a(b) + 1 vektorisieren. Überprüfen Sie folgendes:

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

Wenn Sie einige Indizes mehrmals verwenden, dann accumarray helfen wird, wie folgt:

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

a = 

    1  4  3  5 

Alternativ können Sie verwenden:

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

Siehe this nice answer hier für weitere Details.

+0

In meinem Fall kann b [2 4 2] sein, so dass ich ein (2) zweimal erhöhen muss. Diese Methode aktualisiert a (2) nur einmal. – anirudh

+0

Ich habe die Frage entsprechend aktualisiert. – petrichor

1

Wenn sowohl a als auch b Vektoren sind, sollte dies funktionieren.

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

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