2010-08-26 45 views
6

我想要一個等待一段時間的操作。這裏是我的代碼:如何在Matlab中使用waitbar?

h = waitbar(0,'Please wait...'); 

for i=1:counterend 
    waitbar(i/waitbarcounter) 
    Atemp = At+i*step; 
    handle = @(M) 1/M^2*((2/(gamma+1))*(1+(gamma-1)*M^2/2))^((gamma+1)/(gamma-1))-(Atemp/At)^2; 
    Mach  = fzero(handle, 5); 
    Aplot(i) = Atemp/At; 
    Tplot(i) = Tc/(1+(gamma-1)*Mach^2/2); 
    Mplot(i) = Mach; 
    plot(Aplot, Tplot) 
end 

close(h) 

錯誤Matlab的給予是:

???錯誤使用==> waitbar 249個
不正確的論據waitbar

經過調查,我相信必須的,因爲在循環的sorrounding代碼出現此錯誤。

注:循環工作正常,沒有等待欄。

+1

您的示例在OSX上的R2010a上運行得非常好。你檢查過你的例子嗎?另外,你確定'counterend'是一個標量double嗎? – Jonas 2010-08-26 14:03:57

+0

請不要我大幅改變我的問題。這可能會使一些答案在useles下面。我非常抱歉,如果我應該浪費任何人的時間,對於Stackoverflow來說是相當新的。如果有人認爲刪除是有意義的,我會繼續投票。 – Ingo 2010-08-28 10:33:25

回答

5

運行

counterend = 10000; 
>> h = waitbar(0,'Please wait...'); 

for i=1:counterend 
    waitbar(i/counterend) 
end 

close(h); 

工程在2007年a/Windows XP作爲預期。

在旁註中,它將有助於瞭解被反作用的定義爲。快速檢查的一件事就是確保你沒有將它傳遞給CELL。

運行

counterend = {10000}; 
h = waitbar(0,'Please wait...'); 

for i=1:counterend 
    waitbar(i/counterend) 
end 

close(h); 

單產2007年a不同的錯誤(見下文),但該錯誤消息可以在2008年

已經改變???未定義的函數或方法 '_colonobj'用於 類型'cell'的輸入參數。

我最後一點的建議是警告你使用waitbar的大型數組/數據集。雖然我認爲向用戶通知進展情況非常重要,但對於我而言,還需要考慮向循環添加多少時間。使用具有100k +條目的數組,我成爲Profiler的宗教用戶,查看時間真正花在哪裏。我可以告訴你,時間不在計算I/X,它是在更新等待欄的顯示。爲了減輕更新/汲取的衝擊,我每隔100到1000條就更新一次waitbar,這對幫助非常大。

編輯:更新響應,以配合最新的代碼

我第一次開始在匿名函數來攻擊該問題,在過去與他們的問題這是我個人的仇殺。當看着這個函數,我發現你正在使用伽瑪,你有這個定義爲一個常量(循環/函數常量)?我要問的原因是'gamma'是一個Matlab函數,在嘗試運行你自己的函數時給了我錯誤。下面我修改了你的代碼,並且在這裏運行得很好。如果我提出的任何假設都是錯誤的,請讓我知道。另外,如果你打算使用gamma函數,你的函數會丟失任何參數。希望這可以幫助!

clc 
h = waitbar(0,'Please wait...'); 
counterend = 1000; 
waitbarcounter = counterend; 
g_amma = 7; 
At = 34; 
step = 2; 
Tc = 42; 

for i=1:counterend 
    waitbar(i/waitbarcounter) 
    Atemp = At+i*step; 
    handle = @(M) 1/M^2*((2/(g_amma+1))*(1+(g_amma-1)*M^2/2))^((g_amma+1)/(g_amma-1))-(Atemp/At)^2; 
    Mach  = fzero(handle, 5); 
    Aplot(i) = Atemp/At; 
    Tplot(i) = Tc/(1+(g_amma-1)*Mach^2/2); 
    Mplot(i) = Mach; 
    plot(Aplot, Tplot) 
end 

close(h) 

問候,

亞當

+0

感謝您分享您的經驗。我已經做了一些測試,並且我可以證實你的觀點,即在運行短循環時主要用於更新等待欄。 但在我的情況下,我希望用戶能夠取消操作並查看其進度,因爲他本人可以間接設置循環的長度。這就是我使用waitbar的原因。 您的測試循環運行良好,但我仍然遇到與我的情況相關的問題。 – Ingo 2010-08-28 10:18:49

+0

這是完整的代碼?如果可能的話,你可以添加什麼'counterend'設置?我也看不到'waitbarcounter'在哪裏定義。我會假設他們是平等的,你能證實嗎? – 2010-08-28 14:38:37

3

我在R2008b上檢查過waitbar。到目前爲止,我能夠重現錯誤的唯一方法是將i/counterend評估爲具有多行的數組(1x2向量給出有趣的結果),並在調用waitbar(i/counterend)之前關閉等待條。

我沒有得到任何錯誤運行以下:

h = waitbar(0,'Please wait...'); 
counterend = 1000; 
for i=1:counterend 
    waitbar(i/counterend) 
end 
close(h) 

你能確保上面的小例子,運行沒有錯誤?如果是,請檢查在執行循環期間waitbar未關​​閉,並且counterend是標量(使用dbstop if error在錯誤發生時停止執行您的代碼)。

如果上面的例子沒有出錯,你應該使用which waitbar來檢查你是否使用Matlab的等待欄,而不是使用Matlab文件交換中的任何更新版本。

+0

感謝您的幫助。我絕對使用Matlab的waitbar。 運行示例工作正常。按照你的提示,我檢查了「counterend」的文件類型,結果證明它是double類型的。儘管如此,將它轉換爲「waitbarcounter = uint8(counterend)」也沒有幫助。 附註:今天早上重新啓動Matlab後,突然停止給我一個變量的概述。見[這裏](http://gerth-ac.de/matlab_screen.png)。對此有何幫助? – Ingo 2010-08-28 10:25:29

1

運行

counterned=1000; 
h = waitbar(0,'Please wait...'); 

for i=1:counterend 
    waitbar(i/counterend) 
end 

close(h) 

按預期工作在MATLAB R2009a在Windows XP完美。

1

以上在XP上運行良好的R2008a也。

但是,如果在下一個waitbar命令出現之前終止waitbar窗口,則會出現您描述的錯誤。如果您想對此表示出色,您應該在發出waitbar之前檢查手柄h是否仍然有效。

+0

感謝您的建議,這顯然不是錯誤所在。 – Ingo 2010-08-28 10:20:00

1

我更喜歡使用Steve Hoelzer在MATLAB FEX上編寫的progressbar。我沒有遇到任何問題。

0

你想使用的時候要更新的服務員,你與你的第一行代碼創建的句柄, 服務員(IT/itmax,H, 'progress')

+0

用代碼解釋並簡要說明 – Suresh 2014-10-15 07:59:09

+0

向您的答案添加更多詳細信息 – 2014-10-15 08:11:20