MATLAB-Funktion übergeben nach Verweis
Habe ich eine Klasse mit Eigenschaften, die in ihm (lassen Sie sagen, der name der class-Datei ist inputvar
),
Ich es als input-argument für zwei verschiedene Funktionen, die genau die gleiche Rechnung, aber ein bisschen anders-code, die ich später erklären werde.
Für die erste Funktion (lassen Sie sagen, der name ist myfun1), ich schrieb die Eingabe argument wie dieses:
f = myfun1 (inputvar)
Also jedes mal, wenn ich Variablen verwenden möchten, aus der Klasse innerhalb der Funktion, werde ich anrufen inputvar.var1
, inputvar.var2
, und etc.
Für die zweite Funktion (myfun2), schrieb ich die einzelnen Variablen aus der Klasse in der Eingabe argument, so es sieht wie folgt aus:
f = myfun2 (inputvar.var1, inputvar.var2, ... etc )
Innerhalb der Funktion, die ich nur verwenden var1
, var2
, und etc, ohne den Namen der Klasse.
Nach der Ausführung beide Funktionen habe ich festgestellt, dass myfun2
läuft viel schneller als myfun1
etwa 60% (ich habe tic-toc).
Kann mir jemand erklären warum genau ist das ?
- Versuchen Sie es mit handle-Klassen statt, siehe mathworks.com/help/matlab/ref/handle.html.
- stackoverflow.com/questions/16529681/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
mit der Referenz:
Laut der Aussage oben, wenn Sie direkt pass ein Klasse-Objekt, und ändern Sie Mitglied dieses Objekt, eine ganze operation zum kopieren für die Klasse angewendet wird.
Auf der anderen Seite, geben Sie der Klasse als separate Argumente, Kopiervorgang wird nur angewendet, für die zugehörigen Mitglieder geändert, in der Funktion, was sich in einer schnelleren Ausführung.
Fand ich, dass der Zugriff auf Eigenschaften ist sehr langsam in Matlab. Ich habe nicht gefunden, einen Weg um ihn herum, aber einige grundlegende Ideen sind, finden Sie hier: http://blogs.mathworks.com/loren/2012/03/26/considering-performance-in-object-oriented-matlab-code/
Aber dieser Artikel spricht nur über die Vermeidung furchtbare, grottenschlechte Leistung. Sogar mit den einfachsten Eigenschaften, die Leistung ist bestenfalls mittelmäßig.
Nehmen Sie die Beispiel-Klasse aus dem Mathworks-Artikel. Ich habe kleinen test-script:
Mit diesen Ergebnissen:
Wie Sie sehen können, jede Eigenschaft Zugriff wird langsamer. Versuchen zu Vektorisieren (so wie immer) aber auch das einfache for-Schleife übertrifft die vektorisierte OOP-Lösung für kleine n. (Auf meinem PC sind, Sie brechen auch auf 1e7)
Wesentliche Botschaft: OOP in Matlab zu langsam ist! Sie zahlen den Preis für jede Eigenschaft zugreifen.
Zu deiner Frage: Beim Aufruf
die Werte kopiert. Innerhalb der Funktion, werden Sie nicht mehr den Umgang mit Klassen. Zugriff auf Variablen ist schnell. Allerdings, wenn Sie übergeben die ganze Klasse, jeden Zugriff auf eine Eigenschaft ist langsam. Sie können dies umgehen, indem Sie die Zwischenspeicherung aller Eigenschaften in lokale Variablen und verwenden Sie diese.
Wenn Sie die Klasse ändern, Erben, Griff wird alles ein wenig schneller, aber der Unterschied ist vernachlässigbar.