随时间执行循环

时间:2014-06-05 21:07:03

标签: matlab for-loop timer

我有像这样的for循环

for t = 0: 1: 60
    // my code
end

我想在第1,第2,第3,......,第60秒执行我的代码。这该怎么做?另外我如何在任意时间运行我的代码?例如在第1秒,第3秒和第10秒?

4 个答案:

答案 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对象。这是一个将110的数字打印在连续数字之间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)