2015-04-02 17 views
9

Czy mimo to można zadeklarować zmienne odporne na wyczyszczenie wszystkich w MatLab? Jednym z rozwiązań, o których myślałem, było zapisanie zmiennych i ponowne ich otwarcie, gdy ich potrzebuję. Czy ktoś może pomyśleć o bardziej eleganckim rozwiązaniu?Jak zadeklarować zmienne odporne na wyczyszczenie wszystkiego?

EDYCJA: Pozwól mi wyjaśnić mój problem nieco bardziej szczegółowo, co powinienem był zrobić w pierwszej kolejności; Przepraszam za to.

Muszę uruchomić kilka procedur za pomocą kodu pośredniego "czarnej skrzynki" (niektóre z nich mogą być plikami mex). Byłoby dobrze założyć, że nie mogę zagłębiać się w te kody. Mógłbym zmienić niektóre z nich, ale to byłoby kosztowne; na przykład, nie wiem, gdzie wszystko jest jasne. Wiem, że mogę prosić o zbyt wiele, ale nigdy nie wiadomo.

+1

możesz edytować swoje pytanie trochę zapewnić pewien wgląd, dlaczego to robisz, to znaczy to, co jest rzeczywisty przypadek użycia? – horchler

+3

Umieść swoje procedury blackbox wewnątrz funkcji, wypisz żądane rzeczy. Voilà. Ograniczony czas życia zmiennej. – knedlsepp

Odpowiedz

6

Nie można zabezpieczyć poszczególnych zmiennych, ale można użyć funkcji mlock, aby uniemożliwić usunięcie funkcji M-pliku lub funkcji mex oraz wszelkich zmiennych persistent zdefiniowanych w ramach.

clear all to naprawdę wygoda, gdy użytkownik korzysta bezpośrednio z okna poleceń lub podczas pisania szybkich skryptów. It does a lot more than just clear variables. To nie jest substytutem zrozumienia działania Twojego kodu lub używania funkcji do ograniczenia zakresu zmiennych. Jeśli masz dużą tablicę, która nie jest już używana, możesz jawnie powiedzieć Matlab, aby wyczyścił ją, aby zaoszczędzić pamięć. Założę się, że to, co faktycznie próbujesz zrobić, może zostać rozwiązane przez ponowne przemyślenie struktury twojego kodu.

10

Zamiast chronić zmienne, należy rozważyć użycie clearvars z flagą -except. The use of clear all should be avoided tak, z wyjątkiem tego, że naprawdę trzeba wyczyścić ALL.

clearvars -except v1 v2 ... usuwa wszystkie zmienne, z wyjątkiem wymienionych w następstwie -except

This answer/question może dać Ci dalszych inspiracji.


Zastosowanie:

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

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

lub

clearvars -except a b 

i who powróci:

Your variables are: 

a b 
2

Przede wszystkim, należy w miarę możliwości używaj zmiennych lokalnych. Jeśli ktoś ściąga obszar roboczy bazowy to nie ma znaczenia dla tych zmiennych:

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


function evilblackbox() 
clear all 
end 

Jest brzydki obejście, ale naprawdę nie polecam go używać. Otrzymasz kod, który wymaga restartowania matlab za każdym razem, gdy wyjdziesz z debuggera w niewłaściwym miejscu, rzuci wyjątek lub podobne głupie rzeczy.

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

Aby umieścić zmienną w nim używać crcontainer('name',3), aby przeczytać go używać crcontainer('name')

Powiązane problemy