我想设置一个计数器,通知我一个长迭代计算(例如在for
中)。
是否可以设置此计数器,当它在屏幕上更新时,它会替换以前的值?
也就是说,打印for
的迭代器变量是不行的,因为Matlab要么将它打印到新行,要么打印在前一个值之后,但在10000次迭代之后,屏幕将以任一方式填充。另外,我想在每个回合中更新计数器。
答案 0 :(得分:5)
您可以使用\b
打印退格字符。 e.g:
for i=1:10
fprintf(1, '\b%d', i);
end
答案 1 :(得分:5)
fprintf('\n')
for i=1:15
fprintf([repmat('\b', 1, length(num2str(i-1))) '%d'], i)
pause(0.1)
end
fprintf('\n')
答案 2 :(得分:5)
我之前做过这个功能,它绘制了一个漂亮的ascii进度条。与你的问题的其他两个答案基本相同,但更多的打包
function progressbar(percent, N, init, extrastr)
% Draws a progress bar in the matlab command prompt. Useful for lengthly
% calculations using for loops
%
% Arguments:
% - percent: A number between 0 and 1
% - N: how many characters wide the bar should be
% - init: (optional; default false) true or false; whether or not
% this is the first time calling the progressbar function for
% your current bar.
% - extrastr: (optional; default char(10)) An extra string to append to
% the progress bar. Things will go screwy at the command
% console if this string changes length from call to call of
% progressbar.
%
% Outputs:
%
% Usage Example:
%
% for k=1:1000
% progressbar(k/1000,50,k==1,sprintf('\n We are are on number%4d\n', k));
% % fake a computation
% pause(0.05);
% end
%
if nargin < 3
init = 0;
end
if nargin < 4
extrastr = char(10);
end
percent = min(max(real(percent),0),1);
done = round(N*percent);
done_str = '*'*ones(1, done);
left_str = '-'*ones(1, N-done);
bar = sprintf(['||' done_str left_str '|| %3d'],round(percent*100));
erase = [];
if ~init
% use backspace characters to erase the previously drawn bar
erase = ['' char(8)*ones(1,length(bar)+length(extrastr)+1)];
end
fprintf([erase bar '%s' extrastr], '%');
drawnow;
end
如果你的for循环是巨大的,并且每次传递很短,它将增加大量的开销计算时间,所以只需要每100次循环迭代调用它,或者根据需要调用它。
答案 3 :(得分:3)
您还可以使用waitbar()功能。它有点慢,但看起来不错。
答案 4 :(得分:3)
无论你要使用什么样的等待吧,我都建议你定义一个waitbars界面并实现它。
classdef IWaitBar
methods(Abstract)
GoToPos(positionPercent)
end
end
因此,在计算函数和GUI绘图之间会出现松耦合。
通过这种方式你可以:
WaitBar
的实施,而不修改计算功能。WaitBar
,并按需切换WaitBar
。