Sì questo è possibile ma richiede un po 'di hacking. Richiede che copi alcuni handle di funzione.
Utilizzando l'esempio fornito nella domanda, mostrerò come racchiudere la funzione openvar
in una funzione definita dall'utente che controlla la dimensione della variabile di input e quindi consente all'utente di annullare qualsiasi operazione aperta per le variabili troppo grandi.
Inoltre, questo dovrebbe funzionare quando l'utente fa doppio clic su una variabile nel riquadro Area di lavoro di Matlab IDE.
Abbiamo bisogno di fare tre cose.
- ottenere un handle alla funzione originale
openvar
- Definire la funzione wrapper che chiama
openvar
- reindirizzare il
openvar
nome originale per la nostra nuova funzione.
Esempio Funzione
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
Una volta che questa funzione è definita, allora avete semplicemente bisogno di eseguire uno script che
- Azzera tutte le variabili denominate
openvar
- esegue lo script
openVarWrapper
per impostare la connessione
- point l'originale
openVar
a openVarWrapper
Esempio Script:
clear openvar;
openVarWrapper;
openvar = @openVarWrapper;
Infine, quando si desidera pulire tutto si può semplicemente chiamare:
clear openvar;
Accetto la risposta che hai postato sull'altra domanda (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large- array) è buono per quella domanda di slayton, ma la domanda generale ha una risposta migliore - vedi sotto. – jmetz