如何让等待栏在Matlab中工作?

时间:2010-08-26 13:56:12

标签: matlab

我想要一个需要一段时间的操作的等待栏。这是我的代码:

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 at 249
  等待栏的参数不正确

经过调查,我确信必须发生此错误,因为循环中有周围的代码。

注意:没有等待栏,循环工作正常。

6 个答案:

答案 0 :(得分:5)

运行

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

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

close(h);

在2007a / Windows XP上按预期工作。

另一方面,它有助于了解被反驳的内容。快速检查的一点是确保你没有将它传递给CELL。

运行

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

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

close(h);

在2007a中产生了不同的错误(见下文),但此错误消息可能在2008年发生了变化。

  

???未定义的功能或方法   '_colonobj'表示输入参数   输入'cell'。

我的最后一点建议是提醒你使用waitbar来处理大型数组/数据集。虽然我认为告知用户进度非常重要,但对我来说还有一个问题是循环中添加了多少时间。使用具有100k +条目的数组,我成为了Profiler的宗教用户,以查看实际花费的时间。我可以告诉你时间不在i / X的计算中,而是在更新waitbar的显示时间。为了减轻更新/绘制的影响,我每隔100到1000次更新一次等待条,这对于帮助非常大。

编辑:更新了与最新代码相匹配的回复

我首先开始在匿名函数中解决这个问题,过去遇到问题这是我的个人仇恨。在查看函数时我发现你正在使用gamma,你是否将它定义为常量(循环/函数的常量)?我问的原因是'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) 

此致

亚当

答案 1 :(得分: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)

你能确保上面的小例子运行没有错误吗?如果是,请检查在执行循环期间等待栏是否未关闭,并且counterend是标量(使用dbstop if error在错误发生时停止执行代码)。

如果上面的示例没有错误,您应该使用which waitbar检查您是否在使用Matlab的等待栏,而不是使用Matlab文件交换中的任何更新版本。

答案 2 :(得分:1)

正在运行

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

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

close(h)

在Windows XP上的MATLAB R2009a上完美按预期工作。

答案 3 :(得分:1)

以上在XP上的R2008a上运行也很好。

但是,如果在下一个waitbar命令出现之前终止等待栏窗口,则会出现您描述的错误。如果你想对它好一点,你应该在发出h之前检查句柄waitbar是否仍然有效。

答案 4 :(得分:1)

我更喜欢使用Steve Hoelzer在MATLAB FEX上编写的progressbar。我没有遇到任何问题。

答案 5 :(得分:0)

如果您想要更新服务员,您可以使用您在第一行代码中创建的句柄, 服务员(它/ itmax,H,'进度&#39)