2009-12-15 11 views
14

Utilizo funciones anónimas para la impresión de diagnóstico cuando se depura en MATLAB. Por ejemplo,¿Cómo puedo hacer una función anónima "vacía" en MATLAB?

debug_disp = @(str) disp(str); 
debug_disp('Something is up.') 
... 
debug_disp = @(str) disp([]); 
% diagnostics are now hidden 

Usando disp([]) como "ENGULLEN" parece un poco sucio a mí; ¿Hay alguna opción mejor? (?) El método obvio no funciona:

debug_disp = @(str) ; 

Esto podría, creo, ser útil para otras aplicaciones de lenguaje funcional, no sólo la impresión de diagnóstico.

Respuesta

13

Se podría añadir una función regular de no hacer nada a su base de código.

function NOP(varargin) 
%NOP Do nothing 
% 
% NOP(...) 
% 
% A do-nothing function for use as a placeholder when working with callbacks 
% or function handles. 

% Intentionally does nothing 

A continuación, se puede utilizar un identificador de función a ella en lugar de a una función anónima donde quiera no-op algo.

debug_disp = @NOP; 

Ahora es un tanto auto-documentado, por lo que es explícito que la intención de no hacer nada, en vez de la entrada agarró mal que disp(). Será evidente en el código fuente, además, cuando esté en el depurador y examinando las variables que contienen los identificadores de función, aparecerá como "@NOP", que puede ser más legible que un identificador anónimo. Y puede obtener una lista de todas las operaciones destacadas en el resultado del "informe de perfil" mirando una lista de personas que llaman a NOP.

También podría usar el @deal incorporado de Matlab, que en el caso degenerado no hace nada y no devuelve nada.

+0

Me gusta más este enfoque. A pesar del esfuerzo extra, creo que es de hecho la manera más limpia de hacerlo. –

+4

En mi máquina, este enfoque es más rápido que todos menos dos versiones que probé. 1 millón de llamadas a handle() cuando handle fue 'handle = @ NOP' requerido 7.09 segundos. Mientras que 'handle = @() [];' requirió 23.2 segundos. Me imagino que esto se debe a la sobrecarga de la creación de objetos. 'handle = @() drewow ('update');' requirió 3.37 segundos. 'handle = @() disp ([]);' y 'handle = @() disp ('');' estaban vinculados a 9.71 segundos. La función más rápida fue 'handle = @() (1);' con un tiempo de 0.775 segundos. Sus llamadas, sin embargo, deben terminar con un punto y coma. – Eponymous

+2

Oops 'handle = @() drewow ('update');' tomó 34.0 segundos para un millón de llamadas. Accidentalmente dejé un 0 al escribir 1000000. Por cierto, todavía es mucho más rápido que 'handle = @() drawow;' - que tomó 187 segundos. – Eponymous

3

Si usted está buscando simplemente un comando de "no hacer nada" para reemplazar el cuerpo de la función anónima, probablemente iría con DRAWNOW:

debug_disp = @(str) drawnow; 

esto simplemente tirar de la cola de eventos y actualice los gráficos en lugar de mostrar cualquier texto.

+1

'drawnow()' eventos incurren en un golpe de rendimiento si tiene ventanas abiertas de gráficos. – shabbychef

+0

@shabbychef: Si no quiere actualizar los gráficos, puede usar 'drewow ('UPDATE')'. – gnovice

+1

@gnovice: es importante usar minúsculas para la cadena 'drawnow ('update')', de lo contrario Matlab se queja de "Opción de comando desconocido" – Eponymous

10

Creo que disp([]) o disp('') es perfectamente aceptable. No devuelve nada y no tiene efectos secundarios.

+0

Lo interpreté como '@ (varargin) disp ('')' y esto es la función más concisa, no hacer nada que he visto (que tolera cualquier cantidad de entradas). – sage

3

Aquí hay una función anónima de no hacer nada. No hace nada, y devuelve una matriz vacía, que puede ignorar. Tendrá que suprimir disp poniendo un punto y coma después.

debug_disp = @(str) []; 

El disp ([]) debería funcionar bien también. Cualquiera que sea el estilo que prefieras.

2

tratar debug_disp = @(str)(1);

+0

el comentario [@Andrew Janke] (http://stackoverflow.com/questions/1904972/how-do-i-make-an-empty-anonymous-function-in-matlab/1907943#1907943) hecho también se aplica aquí: si lo haces de esta manera, todas tus llamadas a 'debug_disp' deben terminar con un punto y coma, de lo contrario MATLAB mostrará' ans = 1' :-(. –

Cuestiones relacionadas