我很好奇正在运行的程序的进度,我打印了一些有关当前迭代的信息,例如:
for i = 1:N
...
...
msg = sprintf('Processed %d/%d', i, N);
display(msg)
end
我不想在单独的行上打印进度,而是希望最后一行替换上一行。我不想使用clc
来清除所有内容。
我知道'\b'
可以清除最后一个字符(比如退格键),我可以创建一个带有for循环的函数,该函数将项清除到前一个新行之前。但是有更好的方法吗?如果没有,我如何检查命令行中的最后一个字符是否是新行?
答案 0 :(得分:31)
我刚才看过这个问题。而且我注意到字符\r
(用于擦除最后一行)在命令行(-nodesktop)中使用matlab,但不适用于图形模式...
我找到的最佳解决方案是做类似的事情:
n=0;
for ...
...
fprintf(repmat('\b',1,n));
fprintf(msg);
n=numel(msg);
end
答案 1 :(得分:18)
Yair Altman有a very nice example on his blog如何使用退格控制字符(\b
)来执行您想要的操作,但比您考虑的更容易。修改你的代码就像他的例子一样,你可以这样做:
reverseStr = '';
for i = 1:N
...
...
msg = sprintf('Processed %d/%d', i, N);
fprintf([reverseStr, msg]);
reverseStr = repmat(sprintf('\b'), 1, length(msg));
end
答案 2 :(得分:3)
我为此目的使用'dispstat'功能。它可以更新以前的输出,这是默认'disp'的缺失功能。使用非常简单。可以从这里下载:http://www.mathworks.com/matlabcentral/fileexchange/44673-overwritable-message-outputs-to-commandline-window
***样本用法:
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');
***输出:
11:25:37 Begining the process...
11:25:37 Progress 100%
Finished.
一切顺利
答案 3 :(得分:2)
这是关于你要找的东西
%# 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');
但如果您的代码显示其他结果,则无效。您可能需要考虑使用消息框来更新进度。
答案 4 :(得分:0)
覆盖整个前一行的另一种解决方案依赖于 \r
格式字符,
ctrl=0;
while ctrl<5
fprintf('\rctrl: %i',ctrl);
ctrl=ctrl+1;
pause(2); % To highlight overwrite
end
fprintf('\n'); % Don't forget the newline