2016-06-04 8 views
1

Probieren Sie es aus.MATLAB R2014b spart Zahlengriffe ohne zu fragen

In MATLAB R2014b, eine neue Funktion mit dem folgenden Code erstellen:

function f1 = fhandle_test(x,y) 
f1 = figure; 
scatter(x,y) 

func = @(x) disp(x); 

save('blob.mat','func') 
end 

nun die Funktion mit einigen Zufallsvektoren nennen:

fhandle_test(rand(1,5),rand(1,5)) 

Wenn ich das tue, ich diese Warnmeldung

Warning: Figure is saved in blob.mat. Loading this file recreates and displays the figure and its 
contents. Refer to save for more information. 
> In fhandle_test at 7 

Und tatsächlich ist das Figurobjekt in der MAT-Datei gespeichert und die Figur ist restor ed, wenn ich die Datei lade. Soweit ich das beurteilen kann, geschieht dies nur, wenn ich ein Funktions-Handle oder ein Zellen-Array von Funktions-Handles speichere und nur wenn dies innerhalb einer Funktion geschieht.

es jetzt wieder versuchen, aber diesmal, um die Funktion zu ändern, so dass die Ausgabe der Zahl() auf eine Variable nicht zugeordnet:

function fhandle_test(x,y) 
figure; 
scatter(x,y) 

func = @(x) disp(x); 

save('blob.mat','func') 
end 

Diesmal keine Warnung.

Was passiert hier, und gibt es eine Möglichkeit, es zu verhindern, abgesehen von dem Löschen der Zahlengriffe vor dem Speichern? Ich möchte nicht, dass die Figurenobjekte in der MAT-Datei gespeichert werden und ich brauche die Griffe, meine Funktionen geben sie zurück. Ich würde es auch vorziehen, einen hässlichen Hack zu vermeiden, bei dem ich den Objektraum durchsuchen und die Grafikobjekte nach dem Speichern den Handgriffen zuweisen muss.

Antwort

5

Dies liegt daran, wenn Sie eine anonyme Funktion in einer Datei speichern, die Arbeitsplatz der anonymen Funktion auch in der Datei gespeichert ist. Der Arbeitsbereich der lokalen Funktion wird mit dem Arbeitsbereich der anonymen Funktion gemeinsam genutzt. Daher wird jede Variable, die in der lokalen Funktion (einschließlich des Zahlenpunkts) definiert ist, ebenfalls in der Datei gespeichert.

Der Grund dafür ist, dass es völlig legal ist, eine lokale Variable innerhalb Ihrer anonymen Funktion zu verwenden.

function myfunc(x) 
    y = 2; 
    func = @(x)x+y; 
    save('test.mat', 'func') 
end 

In diesem Fall würden Sie y innerhalb der Datei um in der Lage sein, um richtig die anonyme Funktion auszuführen, wenn es geladen wird wieder speichern müssen. Leider untersucht MATLAB die anonyme Funktion nicht, um festzustellen, welche Variablen verwendet werden. Daher speichert MATLAB nur alles im lokalen Funktionsarbeitsbereich (weshalb Sie das Verhalten sehen, das Sie tun).

Mit der Funktion functions können Sie überprüfen, ob dies der Fall ist, um Informationen zu Ihrer anonymen Funktion zu erhalten.

function fhandle_test(x,y) 
    f1 = figure; 
    scatter(x,y) 

    func = @(x) disp(x); 

    % Get information on workspace of func 
    F = functions(func); 
    celldisp(F.workspace) 

    save('blob.mat','func') 
end 

wird diese Ausbeute

ans{1} = 

    struct with no fields. 

ans{2} = 

     f1: [1x1 Figure] 
     x: 1 
     y: 2 

Sie können überprüfen, dass die Zahl Griff innerhalb der anonymen Funktion Workspaces und damit gespeichert werden. Eine mögliche Problemumgehung (wenn Sie wirklich eine anonyme Funktion speichern müssen) ist, die anonyme Funktion in eine andere Funktion zu platzieren, wo die einzigen lokalen Variablen sind diejenigen, die Sie tatsächlich in der Datei speichern möchten.

function fhandle_test(x,y) 
    f = figure; 
    scatter(x,y) 

    otherfunc(x); 
end 

function otherfunc(x) 
    func = @(x)disp(x); 
    save('blob.mat', 'func'); 
end 
+0

Große Antwort. Aber bist du dir sicher? "In Ihrem Fall, in dem Sie jedoch keine lokalen Variablen innerhalb Ihrer anonymen Funktion verwenden, bestimmt MATLAB nicht wirklich, welche lokalen Variablen beim Speichern der anonymen Funktion berücksichtigt werden sollen und speichert sie einfach." Ersetzen Sie 'func = @ (x) disp (x);' durch 'func = @ (x) disp (y);'. Ich bekomme genau das gleiche Verhalten. –

+2

@StephenBosch Sorry, das war eine verwirrende Aussage. Ich habe es umdeutlich formuliert. MATLAB ist es egal, ob Sie in Ihrer anonymen Funktion lokale Variablen verwenden oder nicht. Es weiß nur, dass es * möglich ist * und speichert daher alle lokalen Variablen unabhängig davon, ob Sie sie verwenden oder nicht. – Suever