Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让服务员在Matlab中工作?_Matlab - Fatal编程技术网

如何让服务员在Matlab中工作?

如何让服务员在Matlab中工作?,matlab,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

我想为一个需要很长时间的手术提供一个服务台。这是我的密码:

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使用==>waitbar时出错
waitbar的不正确参数

经过调查,我确信这个错误一定是由于循环中的排序舍入代码而发生的


注意:没有waitbar,循环可以正常工作。

我已经在R2008b上检查了
waitbar
。到目前为止,我能够重现错误的唯一方法是让
I/counterend
对具有多行的数组求值(1x2向量给出有趣的结果),并在调用
waitbar(I/counterend)
之前关闭waitbar

运行以下命令时,我没有收到任何错误:

h = waitbar(0,'Please wait...');
counterend = 1000;
for i=1:counterend
    waitbar(i/counterend)
end
close(h)
您能确保上面的小示例运行时没有错误吗?如果是,请检查waitbar在循环执行期间是否未关闭,并且
计数器
是否为标量(使用
dbstop If error
在出错时停止代码的执行)

如果上述示例无法正常运行,则应使用
哪个waitbar
检查您是否正在使用Matlab的waitbar,而不是Matlab文件交换中的任何更新版本。

正在运行

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

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

close(h)

在Windows XP上的MATLAB R2009a上工作正常。

上述功能在XP上的R2008a上也可以正常运行

但是,如果在下一个
waitbar
命令出现之前关闭waitbar窗口,则会出现您描述的错误。如果你想表现得好一点,你应该先检查手柄
h
是否仍然有效,然后再发布
waitbar

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

跑步

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

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

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

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

close(h);
在2007a/Windows XP上按预期工作

另一方面,这将有助于了解什么是countered。快速检查的方法是确保您没有通过单元格

运行

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

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

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

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

close(h);
在2007a中产生不同的错误(见下文),但此错误消息在2008年可能已更改

???未定义的函数或方法 的输入参数的“\u colonobj” 输入“cell”

我的最后一点建议是提醒您对大型阵列/数据集使用waitbar。虽然我认为通知用户进度很重要,但对我来说,还有一个问题是循环增加了多少时间。通过使用具有100k+条目的阵列,我成为了探查器的虔诚用户,以了解时间真正花在了哪里。我可以告诉你,时间不是在计算I/X,而是在更新waitbar的显示。为了减轻更新/drawnow带来的冲击,我每100到1000个条目只更新一次waitbar,这非常有帮助

编辑:更新响应以匹配最新代码

我第一次开始在匿名函数中攻击这个问题,在过去与它们有问题,这是我的个人恩怨。当查看函数时,我发现您使用的是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) 
问候,


Adam

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

您的示例在OSX上的R2010a上运行得非常好。你检查过你的例子是否有效吗?另外,您确定
计数器端
是标量双精度吗?请不要以为我实质性地改变了我的问题。这可能使下面的一些答案变得有用。如果我浪费了任何人的时间,我深表歉意,因为我对Stackoverflow很陌生。如果有人认为删除是有意义的,我会投票支持。谢谢你分享你的经验。我做了一些测试,我可以确认你的观点,当运行一个短循环时,时间主要花在更新waitbar上。然而,在我的例子中,我希望用户能够取消一个操作并查看其进度,因为他自己可以间接地设置循环的长度。这就是我申请侍者服务的原因。您的测试循环运行良好,但我的案例仍然存在问题。这是完整的代码吗?如果可能,您可以添加“counterend”设置为什么?我也看不到“waitbarcounter”的定义。我假设他们是平等的,你能证实吗?谢谢你的建议,这显然不是错误所在。谢谢你的帮助。我肯定使用Matlab的waitbar。运行这个示例可以很好地工作。根据您的提示,我检查了“counterend”的文件类型,结果它是double类型。不过,将其转换为“waitbarcounter=uint8(计数器端)”也没有帮助。另一方面:今天早上重新启动Matlab后,它突然停止了对变量的概述。看见有什么帮助吗?请在回答中添加更多细节