有不少小伙伴肯定执行过运行时间到达几小时甚至是几天的matlab程序,运行之后就只看见命令窗口光标一直在闪、左下角状态区一直显示“正忙”,然后,然后就没有然后了,就傻傻地任程序在那里放飞自我
。对于程序已经完成了多少,还剩多少,花了多少时间,还差多少时间全然不知,有没有什么办法可以完美解决这个问题呢?
答案是肯定的,那就是通过在程序运行关键的地方添加进度条。对于一个没有循环的顺序执行程序而言,其计算速度是极快的,故没有必要添加进度条;对于含有循环且运行时间较长的程序而言,程序一般运行时间开销大部分集中在循环部分,因此在程序循环部分添加进度条来代表整个程序的运行进度是能够被接受的。
在matlab中创建进度条的函数为:waitbar
调用格式:f = waitbar(x,msg)
,x为进度条中等待条的长度,其取值在[0, 1]中,msg为等待条消息内容,f为进度条figure句柄。
更新方式:waitbar(x,f,msg),x为进度条中等待条的更新后的位置,f为已存进度条figure句柄,msg为等待条消息内容。
应用示例
% 初始化进度条,并返回句柄
% e = lim(1+1/x)^x (x -> ∞)
f = waitbar(0,'1','Name','极限法求自然常数e值');
% 设置进度条背景颜色
set(f,'color','w');
% 设置x的最大取值
x = 2000;
% 在循环中加入进度条来显示计算过程状态
for k = 1:num
% Update waitbar and message
ek = (1+1/k)^k;
waitbar(k/num,f,sprintf('%s %12.9f %s','当前e值: ',ek,['已完成:',num2str(round(100*k/num)),'%']))
end
有些时候需要多层次监控程序的运行,这时候再使用直接waitbar函数就显得有些困难,通过查阅资料发现由Steve Hoelzer开发的progressbar函数能够实现此功能。progressbar函数具体调用格式请参考程序中的的帮助文档,这里只给出两种需要使用到的方式:
a. progressbar('lab1', 'lab2', ..., 'labn'),lab1, lab2, ..., labn为进度条中n个等待条的标签名称,n用于确定进度条中等待条的条数,此命令的作用是初始化或重置进度条的标签以及值;
b. progressbar(num1,num2, ..., numn) , num1, num2, ..., numn为取值范围在[0, 1]中的实数,此条命令的作用是更新进度条中n条等待条的长度,numi为可以为空,numi为空时,则第i条等待条长度不更新。
示例程序(源自:progressbar函数中自带示例)
% Fancy multi bar (use labels and update all bars at once)
m = 5;
n = 5;
p = 100;
% 初始化进度条并赋3个标签名称
progressbar('Monte Carlo Trials','Simulation','Component') % Init 3 bars
% 在三重循环中演示progressbar的多层次监控能力
for i = 1:m
for j = 1:n
for k = 1:p
pause(0.01) % Do something important
% Update all bars
% 最里层
frac3 = k/p;
% 中间层
frac2 = ((j-1) + frac3) / n;
% 最外层
frac1 = ((i-1) + frac2) / m;
% 实时更新进度条
progressbar(frac1, frac2, frac3)
end
end
end
以上就是今天的全部内容,如有疑问或不清楚progressbar函数如何使用,欢迎在推文下方留言,在公众号中回复“进度条”即可获取今天相关函数。
感谢您的关注和阅读!
参考资料:
[1] https://ww2.mathworks.cn/help/matlab/ref/waitbar.html
[2] https://www.mathworks.com/matlabcentral/fileexchange/6922-progressbar
如需转载,请在公众号中回复“转载”获取授权,未经授权擅自搬运抄袭的,必将追究其责任!