2012-01-11 11 views
17

Sono curioso di sapere lo stato di avanzamento del programma in corso e ho stampare alcune informazioni circa l'iterazione corrente quali:Come cancellare l'ultima riga nella finestra dei comandi

for i = 1:N 
    ... 
    ... 
    msg = sprintf('Processed %d/%d', i, N); 
    display(msg) 
end 

io non voglio di stampa l'avanzamento su linee separate, invece, voglio che l'ultima riga sostituisca la precedente. Non voglio usare clc che cancella tutto il contenuto.

So che '\b' è possibile cancellare l'ultimo carattere (come backspace) e posso creare una funzione con un ciclo for che cancella gli elementi fino alla precedente nuova riga prima dell'ultimo. Ma c'è un modo migliore per farlo? In caso contrario, come posso verificare se l'ultimo carattere sulla riga di comando è una nuova riga o no?

risposta

29

Ho guardato il problema, qualche tempo fa. E ho notato che il carattere \r (usato per cancellare l'ultima riga) funziona con matlab in riga di comando (-nodesktop) ma non con la modalità grafica ...

La soluzione migliore che ho trovato è fare qualcosa così:

n=0; 
for ... 
    ... 
    fprintf(repmat('\b',1,n)); 
    fprintf(msg); 
    n=numel(msg); 
end 
+1

nota: questo mangia il tuo testo precedente. probabilmente dovresti salvare la lunghezza di msg ogni ciclo, e solo 'fprintf (repmat ('\ b', 1, lengthLastMsg));' – Julius

2

E 'per quello che stai cercando per

%# create title 
fprintf('processed: %03d',0) 
for i=1:10 
    %# delete last three digit number and replace with new 
    %# loop index 
    fprintf('\b\b\b\b %03d',i); 

    %# process here 
    pause(.5) 
end 
%# clear line 
fprintf('\n'); 

Ma se il vostro codice visualizza altri risultati questo non funzionerà. e si potrebbe voler considerare l'utilizzo di una finestra di messaggio per aggiornare i progressi.

17

Yair Altman ha a very nice example on his blog di come è possibile utilizzare il carattere di controllo backspace (\b) per fare ciò che si desidera, ma in un modo più semplice di quello che si stava prendendo in considerazione. Modificare il codice per somigliare il suo esempio, si potrebbe fare qualcosa di simile:

reverseStr = ''; 
for i = 1:N 
    ... 
    ... 
    msg = sprintf('Processed %d/%d', i, N); 
    fprintf([reverseStr, msg]); 
    reverseStr = repmat(sprintf('\b'), 1, length(msg)); 
end 
+1

gnovice, grazie mille. Sono abbastanza confuso, ma preferirei accettare la risposta di Oli per 2 minuti di differenza: S – petrichor

+0

@ İsmailArı: Non capisco cosa intendi con "Sono abbastanza confuso ma preferirei accettare la risposta di Oli per 2 minuti di differenza" . – gnovice

+1

Intendo dire che non so quale accettare quando due risposte sono molto simili. Questa è la prima volta che incontro questo problema. Entrambi sono molto utili per me. Quale dovrei accettare? 2 min differenza è il divario tra le risposte come vedo. – petrichor

3

Io uso la funzione 'dispstat' solo per questo scopo. Può aggiornare l'output precedente che è una funzione mancante di "disp" predefinita. Molto semplice da usare. Esso può essere scaricato da qui: http://www.mathworks.com/matlabcentral/fileexchange/44673-overwritable-message-outputs-to-commandline-window

*** utilizzo Esempio:

dispstat('','init'); % One time only initialization 
dispstat(sprintf('Begining the process...'),'keepthis','timestamp'); 
for i = 97:100 
    dispstat(sprintf('Progress %d%%',i),'timestamp'); 
    %doing some heavy stuff here 
end 
dispstat('Finished.','keepprev'); 

*** uscita:

11:25:37 Begining the process... 
11:25:37 Progress 100% 
Finished. 

Tutto il meglio + Questa è una grande risposta chiara

Problemi correlati