Tak to jest możliwe, ale wymaga trochę włamania. Wymaga to kopiowania wokół niektórych uchwytów funkcji.
Na przykładzie podanym w pytaniu pokażę, jak zawinąć funkcję openvar
w funkcji zdefiniowanej przez użytkownika, która sprawdza rozmiar zmiennej wejściowej, a następnie pozwala użytkownikowi anulować dowolną operację otwartą dla zmiennych, które są zbyt duże.
Dodatkowo, to powinno działać, gdy użytkownik kliknie dwukrotnie zmienną w panelu Obszar roboczy Matlab IDE.
Musimy zrobić trzy rzeczy.
- uzyskać uchwyt do pierwotnego
openvar
funkcji
- Zdefiniuj funkcję otoki, który wywołuje
openvar
- Przekierowanie oryginalny
openvar
nazwę naszej nowej funkcji.
Przykład Funkcja
function openVarWrapper(x, vector)
maxVarSize = 10000;
%declare the global variable
persistent openVarHandle;
%if the variable is empty then make the link to the original openvar
if isempty(openVarHandle)
openVarHandle = @openvar;
end
%no variable name passed, call was to setup connection
if narargin==0
return;
end
%get a copy of the original variable to check its size
tmpVar = evalin('base', x);
%if the variable is big and the user doesn't click yes then return
if prod(size(tmpVar)) > maxVarSize
resp = questdlg(sprintf('Variable %s is very large, open anyway?', x));
if ~strcmp(resp, 'Yes')
return;
end
end
if ischar(x) && ~isempty(openVarHandle);
openVarHandle(x);
end
end
Gdy funkcja ta jest zdefiniowana wówczas wystarczy wykonać skrypt
- Czyści wszystkie zmienne o nazwach
openvar
- uruchomić skrypt
openVarWrapper
do Setup połączenie
- wskaż oryginał
openVar
do openVarWrapper
przykładowy skrypt:
clear openvar;
openVarWrapper;
openvar = @openVarWrapper;
Wreszcie, gdy chcemy wyczyścić wszystkiego się można po prostu zadzwonić:
clear openvar;
zgadzam odpowiedź zostanie zaksięgowana na drugim pytaniu (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large- array) jest dobra dla tego pytania, ale ogólne pytanie ma lepszą odpowiedź - patrz poniżej. – jmetz