Si esto es posible, pero requiere un poco de piratería informática. Requiere que copie algunos manejadores de funciones.
Usando el ejemplo proporcionado en la pregunta, mostraré cómo ajustar la función openvar
en una función definida por el usuario que verifica el tamaño de la variable de entrada y luego permite al usuario cancelar cualquier operación abierta para variables demasiado grandes.
Además, esto debería funcionar cuando el usuario hace doble clic en una variable en el panel Espacio de trabajo del IDE de Matlab.
Tenemos que hacer tres cosas.
- obtener un identificador para el original
openvar
función
- Definir la función de contenedor que llama
openvar
- redirigida el nombre original
openvar
a nuestra nueva función.
Ejemplo Función
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 vez que esta función se define a continuación, sólo hay que ejecutar un script que
- borra las variables con nombre
openvar
- ejecuta el script
openVarWrapper
para configurar la conexión
- punto el original,210 a
openVarWrapper
Ejemplo Guión:
clear openvar;
openVarWrapper;
openvar = @openVarWrapper;
Finalmente cuando se desea limpiar todo simplemente puede llamar:
clear openvar;
Acepto la respuesta que ha publicado en la otra pregunta (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large- array) es bueno para esa pregunta slayton, pero la pregunta general tiene una mejor respuesta - ver abajo. – jmetz