我想要一个需要一段时间的操作的等待栏.这是我的代码:
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)
Run Code Online (Sandbox Code Playgroud)
Matlab给出的错误是:
??? 在249时使用==> waitbar时出错.等待条的
参数不正确
经过调查,我确信必须发生此错误,因为循环中的周围代码.
注意:没有等待栏,循环工作正常.
运行
counterend = 10000;
>> h = waitbar(0,'Please wait...');
for i=1:counterend
waitbar(i/counterend)
end
close(h);
Run Code Online (Sandbox Code Playgroud)
在2007a/Windows XP上按预期工作.
另一方面,它将有助于了解被反驳的定义.快速检查的一点是确保您没有将它传递给CELL.
运行
counterend = {10000};
h = waitbar(0,'Please wait...');
for i=1:counterend
waitbar(i/counterend)
end
close(h);
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
问候,
亚当