提问人:Dante 提问时间:6/6/2014 更新时间:6/6/2014 访问量:4753
随时间执行 for 循环
Execute for loop with time
问:
我有一个这样的for循环
for t = 0: 1: 60
// my code
end
我想在第 1 秒、第 2 秒、第 3 秒、第 60 秒内执行我的代码。如何做到这一点?另外,我怎样才能在任意时间运行我的代码?例如在第 1 秒、第 3 秒和第 10 秒?
答:
您可以做的是使用该命令并放置您希望代码停留多少秒。一旦你这样做了,你就执行了你想要的代码。举个例子:pause
pause
times = 1:60;
for t = [times(1), diff(times)]
pause(t); % // Pause for t seconds
%// Place your code here...
...
...
end
正如 @CST-Link 所指出的,我们不应该考虑经过的时间,这就是为什么我们考虑您想要启动循环的相邻时间的差异,以便我们可以尽快启动您的代码。
此外,如果您想要任意时间,请将所有时间放在一个数组中,然后遍历数组。
times = [1 3 10];
for t = [times(1), diff(times)]
pause(t); %// Pause for t seconds
%// Place your code here...
...
...
end
评论
diff(times)
times
虽然大多数时候已经足够好了,但如果您想要更好的准确性,请使用 .pause
java.lang.Thread.sleep
例如,下面的代码将显示计算机时钟的分钟和秒,正好在秒(函数时钟精确到~1微秒),您可以添加代码而不是命令,这只是为了说明它的准确性(有关解释,请参阅代码后面)disp
java.lang.Thread.sleep
while true
c=clock;
if mod(c(6),1)<1e-6
disp([c(5) c(6)])
java.lang.Thread.sleep(100); % Note: sleep() accepts [mSecs] duration
end
end
要查看准确性的差异,您可以将上面的 vs 替换为,并查看您有时如何跳过迭代。java.lang.Thread.sleep(999);
pause(0.999)
有关详细信息,请参阅此处。
编辑:
你可以用 代替 ,这可能更准确,因为它们花费的时间更少......tic\ toc
clock
轮询很糟糕,但 Matlab 默认是单线程的,所以......
对于第一种情况:
tic;
for t = 1:60
while toc < t, pause(0.01); end;
% your code
end;
对于第二种情况:
tic;
for t = [1,3,10]
while toc < t, pause(0.01); end;
% your code
end;
这些电话是在阿姆罗明智地观察了忙于等待之后添加的。0.01 秒听起来像是计时精度和旋转“量”之间的良好交易......pause
评论
tval = tic;
toc(tval)
可以使用计时器
对象。下面是一个示例,该示例在连续数字之间以 1 秒的时间打印 to 中的数字。计时器已启动,并在达到预定义的执行次数时自行停止:1
10
n = 1;
timerFcn = 'disp(n), n=n+1; if n>10, stop(t), end'; %// timer's callback
t = timer('TimerFcn' ,timerFcn, 'period', 1, 'ExecutionMode', 'fixedRate');
start(t) %// start the timer. Note that it will stop itself (within the callback)
一个更好的版本,感谢@Amro:直接将执行次数指定为计时器的属性。完成后不要忘记停止计时器。但不要过早停止它,否则它不会被执行预期的次数!
n = 1;
timerFcn = 'disp(n), n=n+1;'; %// this will be the timer's callback
t = timer('TimerFcn', timerFcn, 'period', 1, 'ExecutionMode', 'fixedRate', ...
'TasksToExecute', 10);
start(t) %// start the timer.
%// do stuff. *This should last long enough* to avoid stopping the timer too soon
stop(t)
评论
t.TasksToExecute = 10
timer
下一个:溢出与 Inf
评论
计时器
。或者,如果您希望它更简单,请暂停
drawnow
在你告诉 Matlab 更新绘图后getframe
for