2017-04-20 1 views
1

Zuerst habe ich mir diese ausgezeichnete article bereits angesehen. Ich habe ein MATLAB-Skript namens sdp. Ich habe ein anderes MATLAB-Skript namens track. Ich renne track nach sdp, da track einige der Ausgaben von sdp verwendet. Um den Track zu starten, muss ich oft eine Funktion namens action aufrufen. Ich habe action als eine Funktion in einer separaten MATLAB-Datei definiert. Jeder Anruf dieser action hat einige Eingänge, sagen x1,x2,x3, aber x2,x3 sind nur "Daten", die sich nie ändern werden. Sie waren die gleichen in sdp, gleichen in track, und bleiben in action gleich. Hier sind x2,x3 riesige Matrizen. Und es gibt viele von ihnen (man denke wie x2,x3,...x10)Alternativen zu globalen Variablen: persistente Variablen und verschachtelte Funktionen in MATLAB

Der lahme Weg ist x2,x3 als global in sdp zu definieren und dann in der Spur, so kann ich mit nur x1 Aktion aufrufen. Aber das verlangsamt meine Leistung unglaublich. Wie kann ich die Aktion immer wieder mit nur x1 so aufrufen, dass es sich merkt, was x2,x3 sind? Jeder Anruf ist sehr schnell, und wenn ich das zum Beispiel inline mache, ist es super schnell.

Vielleicht kann ich einige persistente Variablen verwenden. Aber ich verstehe nicht genau, ob sie auf mein Beispiel anwendbar sind. Ich weiß auch nicht, wie ich sie benutzen soll.

Antwort

0

Werfen Sie einen Blick auf object oriented programming in Matlab. Erstellen Sie ein Objekt action, in dem Sie die Elementvariablen x2 ... den Ergebnissen aus sdp zuweisen. Sie können dann eine Methode von action mit nur x1 aufrufen. Stellen Sie sich das Objekt als eine Funktion mit Status vor, wobei die Zustandsinformationen in Ihrem Fall die konstanten Ergebnisse von sdp sind.

Ein anderer Weg, dies zu tun, um einen funktionalen Ansatz zu verwenden wäre, wo Sie action passieren als function handle zu verfolgen, wo sie sich auf den Variablen von track arbeiten können.

+0

Wäre der objektorientierte Programmieransatz schneller? Bin nicht sicher. Kennen Sie persistente Variablen oder verschachteln Sie diese Funktionen, vielleicht hängt das zusammen? – bissi

0

Das Übergeben großer Matrizen in MATLAB ist effizient. Semantisch verwendet es call-by-value, aber es wird als Call-by-Referenz implementiert, bis es geändert wird. Umhüllen Sie alle unveränderlichen Parameter in einer Struktur von Parametern und übergeben Sie sie herum.

params.x2 = 1; 
params.x3 = [17 39]; 
params.minimum_velocity = 19; 

action('advance', params); 

Sie haben bereits festgestellt, dass Globals nicht gut funktionieren. Machen Sie sich keine Sorgen wegen des syntaktischen Zuckers, irgendwo Variablen zu verstecken ... es gibt Vorteile klar zu sehen, woher die Eingänge kommen und die Leistung wird gut sein.

Dieser Ansatz erleichtert auch das Hinzufügen neuer Datenelemente oder sogar zusätzlicher Metadaten wie eine Beschreibung des Laufs, die Zeit der Ausführung usw. Die Strukturen können zu Arrays kombiniert werden, um mehrere Durchläufe mit unterschiedlichen Parametern zu beschreiben .

+0

Ist diese Parameterstruktur nur ein ästhetisches Konstrukt, oder wirkt sich das auch positiv auf die Leistung aus? Ist das nicht dasselbe wie nur x2 und x3 zu übergeben, aber sie im Parameter params zu verstecken? Wenn ich die Aktion in mein Skriptdatei-Tracking einfüge, wird der Code im Handumdrehen ausgeführt. Aufruf Aktion mehrmals verlangsamt es unglaublich. – bissi

+0

Das klingt wie Funktionsaufruf Overhead. Die Parameterübergabe ist wahrscheinlich nicht einmal das Problem. Denken Sie daran, dass Funktionen besser als Skripte optimieren, also stellen Sie sicher, dass alles eine Funktion ist. – Peter