Unnötige Zuordnungen mit Julia Update-Operatoren

8

Betrachten Sie die folgende Funktion:

%Vor%

Wenn ich es ausführe, bekomme ich Folgendes:

%Vor%

Warum wird so viel Speicher zugewiesen und so viel Zeit für die Speicherbereinigung aufgewendet? Der Code sollte type stable sein, und ich würde erwarten, dass der Operator += keine Neuzuordnung durchführt. Es scheint jedoch, dass es jedes Mal, wenn es zwei Matrizen hinzufügt, neu zugewiesen wird.

Sollte ich das als Fehler in Julia betrachten? Und noch wichtiger: Wie kann ich diesen Code so schreiben, dass er nicht neu zugeordnet wird?

BEARBEITEN: fixierter Tippfehler.

    
Jim Garrison 26.11.2014, 16:57
quelle

3 Antworten

4

@ cd98 hat meine Three-Nested-Loop-Lösung angefordert, die das Zuweisungsproblem löst, aber ich nehme an, dass sie eine äquivalente vektorisierte Version unterschreiten würde. Hier ist es:

%Vor%

Und die Ausgabe:

%Vor%     
Jim Garrison 27.11.2014 19:42
quelle
4

Löst das (ursprüngliche) Zuweisungsproblem nicht, aber ich bekomme eine 1,8-fache Beschleunigung, indem ich einfach die Schleifen in der letzteren Lösung mit @inbounds:

umschließe %Vor%

Ausgabe:

%Vor%

Auch hier gibt es viele gute Diskussionen zu verwandten Themen:

Ссылка

    
Mishmash 02.12.2014 22:44
quelle
3

Es gibt auch die Möglichkeit, Base.Cartesian zu verwenden: nach using Base.Cartesian können Sie schreibe

%Vor%

was sich zu den gleichen Schleifen ausdehnt wie in Jims Antwort.

    
user4235730 28.11.2014 00:19
quelle