2012-06-15 20 views
7

Mam funkcję Matlab, która zajmuje trochę czasu, i chciałbym pokazać użytkownikowi, że postępy są robione. Tylko disp postępy co 5% zbytnio zaśmiecałyby ekran, ponieważ poprzedni tekst nie zostałby skasowany.Pasek postępu tekstu w Matlab

Jak ten problem można rozwiązać? W oknie poleceń są inne ważne informacje, więc czyszczenie go nie wchodzi w rachubę.

Odpowiedz

8

Można użyć waitbar funkcję do tego. Zobacz MATLAB Documentation on waitbar.

+0

Szukałem w wersji tekstowej, ale to było tylko dlatego, że nie wiedział, jak użyteczny 'waitbar' było. Dzięki! – Andreas

12

Wyświetlanie progu w oknie poleceń jest również możliwe (i być może łatwiejsze). Znalazłem bardzo proste, szybkie do wdrożenia rozwiązanie na 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 

Jeśli embedd ten kod linia poleceń jest wyświetlana (na przykład): „Procent zrobić: 27,8” bez wprowadzania nowej linii każdej iteracji!

+0

To powinno być akceptowane rozwiązanie. – theV0ID

+0

Sztuczka polega na tym, że ''\ b'', tj. ASCII 0x08, jest backspace. –

+0

Uwaga: to nie działa w Octave, gdzie standardowe wyjście jest buforowane. –

0

Zasadniczo to, co jest napisane przez @ Ergodicity, jest poprawne, tylko dla Octave, jeśli ustawisz standardowe wyjście do zbuforowania (co jest domyślnie btw), musisz włączyć go przez page_output_immediately (1); zobacz stronę wiecej octave doc: Terminal output

bardzo krótki modyfikacji dotyczących proponowanego kodu:

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