2012-06-15 19 views
7

Ich habe eine Matlab-Funktion, die einige Zeit dauert, und ich möchte dem Benutzer zeigen, dass Fortschritte gemacht werden. Nur disp der Fortschritt alle 5% oder so würde den Bildschirm überladen, wie der vorherige Text nicht gelöscht würde.Text Fortschrittsbalken in Matlab

Wie kann dieses Problem gelöst werden? Es gibt noch andere wichtige Informationen im Befehlsfenster, so dass es nicht in Frage kommt, sie zu löschen.

Antwort

8

Sie waitbar Funktion dafür verwenden können. Siehe MATLAB Documentation on waitbar.

+0

Ich war für eine Textversion suchen, aber das war nur, weil ich nicht wusste, wie nützlich 'waitbar' war. Vielen Dank! – Andreas

12

Das Anzeigen des Fortschritts im Befehlsfenster ist ebenfalls möglich (und möglicherweise einfacher). Ich fand eine sehr einfache, schnell zu implementierende Lösung auf http://undocumentedmatlab.com/blog/command-window-text-manipulation/.

reverseStr = ''; 
for idx = 1 : someLargeNumber 

    % Do some computation here... 

    % Display the progress 
    percentDone = 100 * idx/someLargeNumber; 
    msg = sprintf('Percent done: %3.1f', percentDone); %Don't forget this semicolon 
    fprintf([reverseStr, msg]); 
    reverseStr = repmat(sprintf('\b'), 1, length(msg)); 
end 

Wenn Sie embedd diesen Code in der Befehlszeile (zum Beispiel) zeigt: „Prozent getan: 27,8“ ohne jede Iteration eine neue Zeile eingeben!

+0

Dies sollte die akzeptierte Lösung sein. – theV0ID

+0

Der Trick ist, dass ''\ b'', d. H. ASCII 0x08, ist Backspace. –

+0

Hinweis: Dies funktioniert nicht bei Octave, wo die Standardausgabe gepuffert ist. –

0

Grundsätzlich ist das, was von @Ergodicity geschrieben wird, korrekt, nur für Octave, wenn Sie die Standardausgabe als gepuffert setzen (was standardmäßig btw ist), mussten Sie es durch page_output_immediately (1) aktivieren; siehe diese Seite für mehr octave doc: Terminal output

eine sehr kurzen Änderungen an dem vorgeschlagenen Code:

reverseStr = ''; 
fprintf('Percent done: '); 
for idx = 1 : someLargeNumber 
    % Do some computation here... 
    % Display the progress 
    percentDone = 100 * idx/someLargeNumber; 
    msg = sprintf('%3.1f', percentDone); %Don't forget this semicolon 
    fprintf([reverseStr, msg]); 
    reverseStr = repmat(sprintf('\b'), 1, length(msg)); 
end