2016-06-30 10 views
3

Ich weiß, dass in Matlab, gibt es eine "faule" Bewertung, wenn eine neue Variable zu einer vorhandenen zugewiesen wird. Wie zum Beispiel:MATLAB Variablenübergabe und Lazy Zuweisung

array1 = ones(1,1e8); 
array2 = array1; 

Der Wert von array1 nicht an array2 kopiert werden, wenn das Element der array2 modifiziert wird.

Von diesem vermutete ich, dass alle Variablen in Matlab tatsächlich Werttyp sind und alle durch Werte übergeben werden (obwohl faule Auswertung verwendet wird). Dies bedeutet auch, dass die Variablen auf dem Aufruf-Stack erstellt werden.

Nun, ich beurteile nicht die Art, wie es die Variablen behandelt, obwohl ich noch nie eine zweite Programmiersprache auf diese Weise gesehen habe. Ich meine, für möglicherweise große Datenstrukturen wie Arrays, es als Werttyp zu behandeln und es nach Werten zu übergeben, scheint keine gute Idee zu sein. Obwohl die faule Bewertung den Raum und die Zeit spart, erscheint es mir nur seltsam. Sie können einen Ausdruck für die Mutation (anstelle der Initialisierung oder Zuweisung) einer Variablen haben, die zu einem Fehler wegen zu wenig Arbeitsspeicher führt. Soweit ich weiß, sind in C-Array-Namen tatsächlich Zeiger, und in Fortran werden Arrays als Referenz übergeben. Die meisten modernen Sprachen ziehen Arrays als Referenztyp zurück.

Also, kann mir jemand sagen, warum Matlab eine solche nicht so häufige Art und Weise verwenden, um die Arrays zu implementieren. Stimmt es, dass in Matlab nichts auf dem Heap erstellt wird oder erstellt werden kann?

Übrigens, ich habe einige erfahrene Matlab-Benutzer danach gefragt. Sie sagen einfach, dass sie die Variable nie ändern, sobald sie erstellt wurde, und verwenden den Funktionsaufruf, um neue Variablen zu erstellen. Das bedeutet, dass alle veränderbaren Daten unveränderlich behandelt werden. Gibt es einen Gewinn oder Verlust für die Programmierung auf diese Weise?

+0

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

+0

@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. –

+0

@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. –

Antwort

0

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.

Es gibt einen Unterschied zwischen den Variablen Wert übergeben werden oderdurch Bezugnahme und Variablen mit Wert Semantik oder Referenz Semantik.

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.

Dennoch können MATLAB Variablen entweder Wert Semantik oder Referenzsemantik. In MATLAB wird eine Variable mit Referenzsemantik als Handle Variable bezeichnet.

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:

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

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

+0

Danke für die Antwort. Ich möchte nur erwähnen, dass in C Zeiger an ihren Werten übergeben werden und auf das, worauf sie hinweisen, dereferenziert sind. Die Aussage "Sie können per Referenz mit einem Zeiger übergeben werden" ist irreführend. In C++ wird die Referenzübergabe durch ihre _reference_-Variablen erreicht. Die Übergabe nach Wert oder Verweis ist eigentlich nicht relevant, ob die Sprache Zeiger unterstützt oder nicht. Denken Sie zum Beispiel an VB.Net und C#. –

+0

@XiaojunChen Ich denke nicht, dass wir nicht übereinstimmen. Was jedoch irreführend ist, ist die Anwendung von Termen, die aus C stammen, auf MATLAB, und sie sind für alle anderen Sprachen nicht gut definiert. –