2009-12-15 3 views
14

Uso le funzioni anonime per la stampa diagnostica durante il debug in MATLAB. Per esempio,Come si crea una funzione anonima "vuota" in MATLAB?

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

Utilizzando disp([]) come "trangugiare" sembra un po 'sporco per me; c'è un'opzione migliore? (?) Il metodo ovvio non funziona:

debug_disp = @(str) ; 

Questo potrebbe, a mio avviso, essere utile per altre applicazioni linguaggio funzionale, non solo la stampa diagnostica.

risposta

13

si potrebbe aggiungere una funzione regolare do-nothing alla vostra base di codice.

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 

quindi è possibile utilizzare una maniglia funzione per esso invece che a una funzione anonima dove vuoi no-op qualcosa.

debug_disp = @NOP; 

Ora è un po 'auto-documentazione, rendendo esplicito che si intende fare nulla, invece di prese di ingresso sbagliato per DISP(). Sarà evidente nel codice sorgente, più, quando sei nel debugger ed esaminando le variabili che tengono le maniglie di funzione, che verrà visualizzato come "@NOP", che può essere più leggibile di una maniglia anonima. Inoltre, è possibile ottenere un elenco di tutte le operazioni eliminate nell'output del "rapporto profilo" visualizzando un elenco di chiamanti su NOP.

Si potrebbe anche usare Matlab built-in @deal, che nel caso degenere non fa nulla e non restituisce nulla.

+0

Mi piace questo approccio migliore. Nonostante lo sforzo extra, penso che è davvero il modo più pulito per farlo. –

+4

Sulla mia macchina, questo approccio è più veloce di tutte tranne due versioni che ho provato. 1 milione di chiamate a handle() quando handle era 'handle = @ NOP' richiesto 7,09 secondi. Mentre 'handle = @() [];' richiesto 23.2 secondi. Immagino che questo sia dovuto al sovraccarico della creazione di oggetti. 'handle = @() drawnow ('update');' richiesto 3.37 secondi. 'handle = @() disp ([]);' e 'handle = @() disp ('');' erano legati a 9.71 secondi. La funzione più veloce era 'handle = @() (1);' con un tempo di 0,775 secondi. Le sue chiamate, tuttavia, devono essere terminate con un punto e virgola. – Eponymous

+2

Oops 'handle = @() drawnow ('update');' ha impiegato 34,0 secondi per un milione di chiamate. Ho accidentalmente omesso lo 0 quando digito 1000000. A proposito, è ancora molto più veloce di 'handle = @() drawnow;' - che impiega 187 secondi. – Eponymous

3

Se siete semplicemente alla ricerca di un comando "do-nothing" per sostituire il corpo della funzione anonima, probabilmente sarei andare con DRAWNOW:

debug_disp = @(str) drawnow; 

Ciò semplicemente svuotare la coda degli eventi e aggiorna la grafica invece di visualizzare qualsiasi testo.

+1

'drawNow()' eventi incorrere in un calo di prestazioni se si dispone di aprire finestre grafiche. – shabbychef

+0

@shabbychef: Se non si desidera aggiornare la grafica, è possibile utilizzare 'drawNow ('UPDATE')'. – gnovice

+1

@gnovice: è importante usare la minuscola per la stringa 'drawnow ('update')', altrimenti Matlab si lamenta di "Unknown command option" – Eponymous

10

Penso disp([]) o disp('') è perfettamente accettabile. Non restituisce nulla e non ha effetti collaterali.

+0

Ho interpretato questo come '@ (varargin) disp ('')' e questo è la funzione più concisa e inutile che ho visto (che tollera qualsiasi numero di input). – sage

3

Ecco una funzione anonima do-nothing. Non fa nulla e restituisce un array vuoto, che puoi semplicemente ignorare. Dovrai sopprimere disp inserendo un punto e virgola.

debug_disp = @(str) []; 

Anche il disp ([]) dovrebbe funzionare correttamente. Qualunque sia lo stile che preferisci.

2

provare debug_disp = @(str)(1);

+0

il commento [@Andrew Janke] (http://stackoverflow.com/questions/1904972/how-do-i-make-an-empty-anonymous-function-in-matlab/1907943#1907943) fatto vale anche qui: se lo fai in questo modo, tutte le tue chiamate a 'debug_disp' devono essere terminate da un punto e virgola, altrimenti MATLAB visualizzerà' ans = 1' :-(. –