2010-08-26 47 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