Sie formulieren Ihre Frage auf eine verwirrende Art und Weise, indem Sie Begriffe aus Programmiersprachen wie C und FORTRAN verwenden, die irreführend sind, wenn sie auf andere Sprachen angewendet werden.
In C können Variablen als Wert übergeben werden, oder sie können als Verweis mithilfe eines Zeigers übergeben werden.
MATLAB hat keine Zeiger. Was auch immer Ihnen gesagt wurde, MATLAB übergibt Variablen immer nach Wert. Da es keine Zeiger hat, ist es nicht sinnvoll zu fragen, ob Variablen nach Wert oder Verweis übergeben werden - es muss nach Wert sein.
Hervorheben - auch wenn die Variable als Wert übergeben wird, kann sie Wert- oder Referenzsemantik haben.
Wenn Sie eine reguläre Variable erstellen:
>> a = 1;
Die Variable a
Wert Semantik hat.Das heißt, wenn Sie eine andere Variable daraus erstellen und dann das Original ändern, ändert sich die neue Variable nicht.
>> b = a;
>> b
b =
1
>> a = 2;
>> b
b =
1
Aber wenn Sie erstellen zum Beispiel eine Figur:
>> f = figure;
Die Variable f
Bezug hat, oder Semantik behandeln. Das heißt, wenn Sie eine andere Variable daraus erstellen und dann das Original ändern, ändert sich auch die neue Variable.
>> get(f, 'Name')
ans =
''
>> g = f;
>> set(f, 'Name', 'hello')
>> get(g, 'Name')
ans =
hello
Wenn Sie Ihre eigenen Variablentypen mit MATLAB OO Klassen definieren, können Sie die Objekte dieser Klasse angeben, ob der Wert oder Referenz haben/Semantik behandeln, indem die Klasse aus der integrierten Klasse handle
vererben.
Objekte, die Instanzen von Wertklassen sind, verhalten sich ähnlich wie a
oben; Objekte, die Instanzen von Handle-Klassen sind, verhalten sich ähnlich wie f
oben. Und sie sind beide, immer, nach Wert weitergegeben.
Ich vermute den zugrunde liegenden Grund für Ihre Frage: aber ich würde empfehlen, dass Sie einen Blick darauf werfen, wie Sie Handle-Klassen erstellen. Sie werden Ihnen wahrscheinlich das variable Verhalten bieten, das Sie erreichen möchten (d. H. Es weitergeben können, eine Kopie davon aufnehmen, ohne den Speicher signifikant zu erhöhen, und es bezieht sich immer auf die gleiche zugrunde liegende Sache).
Wenn die "erfahrenen MATLAB-Benutzer", mit denen Sie gesprochen haben, nur Wertvariablen verwenden, dann verlieren sie sehr viel - es ist sehr viel bequemer, Variablen zu verwenden. Und ich würde tatsächlich wetten, dass sie sie verwenden, ohne es zu merken - so ziemlich alles von MATLAB Handle Graphics setzt auf Handle-Variablen, wie f
oben.
Ich glaube, das Obige ist eine vollständige Erklärung der Semantik von MATLAB-Variablen. Es gibt ein paar andere Falten, die Menschen zu verwirren, aber sie widersprechen nicht der oben:
Obwohl MATLAB-Pass-by-Wert Verhalten hat (die, wie oben ist anders erklärt aus, ob Variablen Wert oder Referenz Semantik), es hat auch faul oder Kopie-auf-schreiben Verhalten. Du beschreibst das in deiner Frage, also bekommst du offensichtlich, was es tut, aber es ist einfach eine Optimierung, die ein anderes Problem ist als das Passing-Verhalten oder die Variablen-Semantik. in-Place-Optimierungen auf Ihren Code (dh Überschreiben der ursprünglichen Variablen eher
Wie in einem Kommentar von @Bernhard erwähnt, wenn Sie Funktionen implementieren eine Syntax ähnlich wie x = myfun(x)
anstatt die normalen y = myfun(x)
können MATLAB durchführen als zu machen (eine temporäre Kopie) unter bestimmten Umständen (insbesondere müssen die unter x
innerhalb ausgeführten Operationen vor Ort durchgeführt werden können, wie arithmetische oder trigonometrische Funktionen, und nicht Matrixoperationen wie '
, die die Abmessungen ändern würden). Aber auch dies ist nur eine Optimierung, es ändert nicht die Semantik der Variablen.
PS Noch eine Sache - aufhören, über den Stapel zu denken und den Heap als auch, In MATLAB gibt es kein Analogon, da Sie nicht wirklich kontrollieren können, in welchem Speicherbereich Ihre Variablen gespeichert sind.
Ich habe keine Zeit für eine lange Antwort, aber Matlab übergibt Argumente nicht immer nach Wert. Wenn Sie etwas wie "x = func (x)" machen, wird Matlab es als Referenz übergeben. Wenn Sie etwas wie "y = func (x)" machen, wird es als Referenz übergeben, wenn Sie 'x' in' func() 'nicht ändern, aber nach Wert, wenn Sie dies tun. Sie können dies nicht explizit tun, deshalb müssen Sie beim Schreiben von Funktionen vorsichtig sein. Nie eine Variable zu ändern scheint eine schreckliche Lösung zu sein. Wie ist es dann eine Variable? – Bernhard
@Bernhard Matlab übergeben Funktion wie 'x = func (x)' durch Verweis, da sein Just-in-Time-Compiler es als eine Inline-Funktion behandelt, so dass kein zusätzlicher Aufruf-Stapel erstellt wird (solange diese Funktion keine geschachtelte Funktion ist)). Wenn Sie hier eine Variable ändern, bedeutet dies, dass Sie ihren Wert ändern müssen. Sie können eine Variable natürlich einem anderen Wert zuweisen. –
@Bernhard Die Art, wie Matlab mit Variablen umgeht, lässt Programmierer ihre Codes sehr sorgfältig schreiben, genau wie du gesagt hast. Für mich macht das Erstellen von Arrays (oder Zellen) als Werttyp Variablen Rätsel und überraschen mich. Denn ohne seine Semantik vollständig zu verstehen, wird der Programmierer niemals wissen, wann sie unnötigerweise zusätzliche Rechenzeit und Platz verursachen können. –