我对正在运行的程序的进度很好奇,我打印了一些关于当前迭代的信息,例如:
for i = 1:N
...
...
msg = sprintf('Processed %d/%d', i, N);
display(msg)
end
我不想在单独的行上打印进度,相反,我希望最后一行替换前一行。我不想使用清除所有内容的clc
。
我知道'\b'
可以清除最后一个字符(如退格键),并且我可以创建一个带有for循环的函数,该循环清除项目,直到最后一行之前的前一个新行。但是有没有更好的方法呢?如果不是,如何检查命令行的最后一个字符是否换行?
发布于 2012-01-12 04:27:39
不久前,我已经看过这个问题了。我注意到,在命令行(-nodesktop)中,\r
字符(用于擦除最后一行)可以在matlab中使用,但在图形模式下则不适用。
我找到的最好的解决方案是这样做:
n=0;
for ...
...
fprintf(repmat('\b',1,n));
fprintf(msg);
n=numel(msg);
end
发布于 2012-01-12 04:25:57
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
发布于 2013-12-12 17:58:54
我使用'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.
万事如意
https://stackoverflow.com/questions/8825796
复制相似问题