我有像这样的for循环
for t = 0: 1: 60
// my code
end
我想在第1,第2,第3,......,第60秒执行我的代码。这该怎么做?另外我如何在任意时间运行我的代码?例如在第1秒,第3秒和第10秒?
答案 0 :(得分:5)
您可以使用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
答案 1 :(得分:4)
轮询很糟糕,但默认情况下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;
在Amro明智地观察忙碌等待之后,添加了pause
次来电。 0.01秒听起来像是时间精度和旋转“量”之间的良好交易......
答案 2 :(得分:2)
虽然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
要查看准确度的差异,您可以将上述内容替换为java.lang.Thread.sleep(999);
vs pause(0.999)
,并了解您有时会跳过迭代。
有关详细信息,请参阅here。
您可以使用tic\ toc
代替clock
,这可能更准确,因为它们花费的时间更短......
答案 3 :(得分:2)
您可以使用timer
对象。这是一个将1
到10
的数字打印在连续数字之间1秒的示例。计时器启动,并在达到预定义的执行次数时自动停止:
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)