2012-01-11 91 views
17

我很好奇正在運行的程序的進程的最後一行,我打印有關當前迭代比如一些信息:如何清除在命令窗口

for i = 1:N 
    ... 
    ... 
    msg = sprintf('Processed %d/%d', i, N); 
    display(msg) 
end 

我不想打印在不同的線路上取得進展,相反,我希望最後一行替換前一行。我不想使用清除所有內容的clc

我知道'\b'可以清除最後一個字符(比如退格鍵),我可以使用for循環創建一個函數,該函數清理項目,直到上一行之前的新行。但是有沒有更好的方法來做到這一點?如果沒有,我如何檢查命令行中的最後一個字符是否是新行?

回答

29

我已經看過這個問題,前一陣子。我注意到字符\r(用於擦除最後一行)可以在命令行(-nodesktop)中使用matlab,但不能與圖形模式一起使用...

我發現的最佳解決方案是執行某些操作像這樣:

n=0; 
for ... 
    ... 
    fprintf(repmat('\b',1,n)); 
    fprintf(msg); 
    n=numel(msg); 
end 
+1

注意:這會吃掉以前的文字。你應該在每個循環中保存msg的長度,並且只保存'fprintf(repmat('\ b',1,lengthLastMsg));'' – Julius 2015-03-24 22:05:04

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'); 

但是如果你的代碼顯示其他結果,這將無法正常工作。您可能需要考慮使用消息框來更新進度。

17

Yair Altmana 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 
+1

+這是一個偉大的明確答覆gnovice,非常感謝。我很困惑,但我最好接受奧利的答案2分鐘的差異:S – petrichor 2012-01-11 21:08:42

+0

@İsmailArı:我不太明白你的意思,「我很困惑,但我最好接受奧利的答案2分鐘的差異」 。 – gnovice 2012-01-11 21:19:30

+1

我的意思是當兩個答案非常相似時,我不知道接受哪一個。這是我第一次遇到這個問題。兩者對我都很有幫助。我應該接受哪一個? 2分鐘的差距就是我所看到的答案之間的差距。 – petrichor 2012-01-11 21:24:42

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. 

所有最優秀的