2015-04-02 6 views
9

Gibt es sowieso Variablen in MatLab zu deklarieren, die immun sind, um alles zu löschen? Eine Lösung, an die ich dachte, war, die Variablen zu speichern und sie wieder zu öffnen, wann immer ich sie brauche. Kann jemand an eine elegantere Lösung denken?Wie man Variablen erklärt, die immun sind, um alles zu löschen?

EDIT: Lassen Sie mich mein Problem etwas gründlicher erklären, was ich an erster Stelle hätte tun sollen; das tut mir leid.

Ich muss ein paar Routinen mit einigen "Black Box" Zwischencode (einige davon können mex-Dateien sein). Es wäre gut anzunehmen, dass ich nicht auf diese Codes eingehen kann. Ich könnte einige von ihnen ändern, aber das wäre teuer; Zum Beispiel weiß ich nicht, wo alles klar ist. Ich weiß, dass ich zu viel verlangen kann, aber du weißt es nie.

+1

Können Sie Ihre Frage ein wenig bearbeiten einen Einblick darüber zu geben, warum Sie das tun, das heißt, was ist das tatsächlicher Anwendungsfall? – horchler

+3

Setzen Sie Ihre Blackbox-Routinen in eine Funktion, geben Sie die gewünschten Daten aus. Voilà. Begrenzte variable Lebensdauer – knedlsepp

Antwort

6

Sie können einzelne Variablen nicht schützen, aber Sie können mlock verwenden, um zu verhindern, dass eine M-Datei- oder Mex-Funktion gelöscht wird und alle darin definierten persistent Variablen.

clear all ist wirklich eine Bequemlichkeit, wenn man das Befehlsfenster direkt oder beim Schreiben schneller Skripte verwendet. It does a lot more than just clear variables. Es ist kein Ersatz für das Verständnis, wie Ihr Code funktioniert, oder die Verwendung von Funktionen zur Begrenzung des Variablenbereichs. Wenn Sie ein großes Array verwenden, das nicht mehr verwendet wird, können Sie Matlab ausdrücklich anweisen, es zu löschen, um Speicherplatz zu sparen. Ich würde wetten, dass das, was Sie tatsächlich tun wollen, gelöst werden könnte, indem Sie die Struktur Ihres Codes neu überdenken.

10

Anstatt Variablen zu schützen, erwägen Sie die Verwendung von clearvars mit dem -except Flag. The use of clear all should be avoided sowieso, außer Sie müssen wirklich löschen ALL.

clearvars -except v1 v2 ... löscht alle Variablen mit Ausnahme der angegebenen nach dem -außer

This answer/question können Sie weitere Inspiration geben.


Verbrauch:

a = 1; 
b = 2; 
c = 3; 

vars2keep = {'a','b'} 
clearvars('-except',vars2keep{:}) 

oder

clearvars -except a b 

und who zurückkehren wird:

Your variables are: 

a b 
2

Zunächst einmal sollten Sie Verwenden Sie nach Möglichkeit lokale Variablen. Wenn jemand den Basisarbeitsbereich löscht es nicht für diese Variablen Rolle:

function yourcode() 
x=1 
evilblackbox() 
%x is still here 
disp(x) 
end 


function evilblackbox() 
clear all 
end 

Es gibt eine hässliche Abhilfe ist, aber ich empfehle wirklich nicht, es zu benutzen. Sie werden mit Code enden, der neustart Matlab erfordert, wenn Sie den Debugger an einem falschen Ort verlassen, löst es eine Ausnahme oder ähnliche dumme Sachen.

function r=crcontainer(field,data) 
persistent X 
mlock 
if exist('data','var') 
    X.(field)=data; 
end 
r=X.(field); 
end 

Um in eine Variable zu setzen, crcontainer('name',3), verwenden Sie es crcontainer('name')

verwenden, um lesen