【问题标题】:How can I get a waitbar to work in Matlab?如何让等待栏在 Matlab 中工作?
【发布时间】:2010-08-26 13:56:12
【问题描述】:

我想为需要很长时间的操作设置一个等待栏。这是我的代码:

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 给出的错误是:

???在 249 处使用 ==> 等待栏时出错
等待栏的参数不正确

经过调查,我确信这个错误一定是因为循环中的环绕代码。

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

【问题讨论】:

  • 您的示例在 OSX 上的 R2010a 上运行良好。您是否检查过您的示例是否有效?另外,您确定 counterend 是双标量吗?
  • 请不要说我大大改变了我的问题。这可能会使下面的一些答案变得无用。如果我对 Stackoverflow 很陌生,如果浪费了任何人的时间,我深感抱歉。如果有人认为删除有意义,我会投票支持。

标签: matlab


【解决方案1】:

跑步

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' 用于输入参数 输入“细胞”。

我的最后一点建议是警告您不要将 waitbar 用于大型数组/数据集。虽然我认为通知用户进度很重要,但对我来说,还有一个问题是循环增加了多少时间。使用具有 100k+ 条目的数组时,我成为 Profiler 的忠实用户,以查看时间真正花在了哪里。我可以告诉你时间不在 i/X 的计算中,而是在更新等待栏的显示。为了减轻更新/drawnow 的打击,我只每 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) 

问候,

亚当

【讨论】:

  • 感谢您分享您的经验。我已经进行了一些测试,我可以确认您的观点,即在运行短循环时,时间主要用于更新等待栏。然而,就我而言,我希望用户能够取消操作并查看其进度,因为他自己可以间接设置循环的长度。这就是我应用等待栏的原因。您的测试循环运行良好,但我的案例仍然遇到问题。
  • 这是完整的代码吗?如果可能的话,您可以添加“counterend”设置的内容吗?我也看不到“waitbarcounter”的定义。我会假设他们是平等的,你能确认一下吗?
【解决方案2】:

我在 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 文件交换中的许多更新版本。

【讨论】:

  • 感谢您的帮助。我绝对使用 Matlab 的等待栏。运行示例工作正常。按照您的提示,我检查了“counterend”的文件类型,结果发现它是 double 类型。不过,将其转换为“waitbarcounter = uint8(counterend)”也无济于事。附带说明:今天早上重新启动 Matlab 后,它突然停止向我提供变量的概述。见here。有什么帮助吗?
【解决方案3】:

跑步

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

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

close(h)

在 Windows XP 上的 MATLAB R2009a 上按预期完美运行。

【讨论】:

    【解决方案4】:

    以上在 XP 上的 R2008a 上也可以正常运行。

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

    【讨论】:

    • 感谢您的建议,但这显然不是错误所在。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      当您想更新服务员时,您假设使用您在第一行代码中创建的句柄, 服务员(it/itmax,h,'progress')

      【讨论】:

      • 为您的答案添加更多详细信息
      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多