2012-06-15 12 views
7

Tengo una función de Matlab que tarda un tiempo en ejecutarse, y me gustaría mostrarle al usuario que se está progresando. Solo disp el progreso aproximadamente cada 5% llenaría demasiado la pantalla, ya que el texto anterior no se borrará.Barra de progreso de texto en Matlab

¿Cómo se puede resolver este problema? Hay otra información importante en la ventana de comandos, por lo que borrarla está fuera de discusión.

Respuesta

8

Puede utilizar la función waitbar para eso. Ver MATLAB Documentation on waitbar.

+0

que estaba buscando una versión de texto, pero eso fue sólo porque no sabía lo útil que era 'waitbar'. ¡Gracias! – Andreas

12

Mostrar el progreso en la ventana de comandos también es posible (y tal vez más fácil). Encontré una solución muy simple y rápida de implementar en 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 

Si embedd el código de la línea de comandos está mostrando (por ejemplo): "Porcentaje hecho: 27.8" sin introducir una nueva línea cada iteración!

+0

Esta debería ser la solución aceptada. – theV0ID

+0

Entonces, el truco es que ''\ b'', es decir, ASCII 0x08, está en retroceso. –

+0

Nota: esto no funciona en Octave, donde la salida estándar está protegida. –

0

Básicamente, lo que escribe @Ergodicity es correcto, solo para Octave si establece la salida estándar para ser almacenada en búfer (que es por defecto btw), debe habilitarla por page_output_immediately (1); ver esta página para más octave doc: Terminal output

una muy breve modificaciones en el código propuesto:

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