随时间执行 for 循环

Execute for loop with time

提问人:Dante 提问时间:6/6/2014 更新时间:6/6/2014 访问量:4753

问:

我有一个这样的for循环

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

我想在第 1 秒、第 2 秒、第 3 秒、第 60 秒内执行我的代码。如何做到这一点?另外,我怎样才能在任意时间运行我的代码?例如在第 1 秒、第 3 秒和第 10 秒?

MATLAB FOR 循环 定时器

评论

3赞 Luis Mendo 6/6/2014
检查计时器。或者,如果您希望它更简单,请暂停
2赞 Luis Mendo 6/6/2014
不要忘记 drawnow 在你告诉 Matlab 更新绘图后
4赞 bla 6/6/2014
@user96402如果是这种情况,您可以使用 录制电影,然后以 1 fps 的速度播放......getframe
1赞 rayryeng 6/6/2014
@user-96402:是的。如果要绘制动画,则不需要使用循环。获取帧,并以指定的帧速率播放它们就足够了。for
1赞 Amro 6/6/2014
+1 对纳坦的建议。以下是该方法的一些示例: stackoverflow.com/a/11054155/97160

答:

5赞 rayryeng 6/6/2014 #1

您可以做的是使用该命令并放置您希望代码停留多少秒。一旦你这样做了,你就执行了你想要的代码。举个例子:pausepause

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赞 rayryeng 6/6/2014
@LuisMendo:啊哈哈,没问题。只是意味着我们在同一个波长上
0赞 6/6/2014
实际上,代码应该为 的值暂停,而不是为 的值暂停。因为不应该考虑经过的时间...... :-)我可以更改您帖子中的代码吗?diff(times)times
0赞 rayryeng 6/6/2014
@CST-Link:啊哈,当然是。是的,请随意。获取您的 +2 代表:)
0赞 6/6/2014
@rayryeng 希望您会同意我的更改,感谢您给我这个机会。:-)
2赞 bla 6/6/2014 #2

虽然大多数时候已经足够好了,但如果您想要更好的准确性,请使用 .pausejava.lang.Thread.sleep

例如,下面的代码将显示计算机时钟的分钟和秒,正好在秒(函数时钟精确到~1微秒),您可以添加代码而不是命令,这只是为了说明它的准确性有关解释,请参阅代码后面)dispjava.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\ tocclock

5赞 user2271770 6/6/2014 #3

轮询很糟糕,但 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

评论

1赞 Amro 6/6/2014
您可能希望在 while 循环中插入一个小的停顿,以减少繁忙的等待
0赞 6/6/2014
@Amro整洁!如果您愿意,请继续在代码中进行修改。:-)
1赞 Amro 6/6/2014
还有一件事(我保证最后一条评论!):您还可以使用显式的 tic/toc 指标(如:和 ),以防万一“代码”使用自己的 tic/toc 计时器。tval = tic;toc(tval)
2赞 Luis Mendo 6/6/2014 #4

可以使用计时器对象。下面是一个示例,该示例在连续数字之间以 1 秒的时间打印 to 中的数字。计时器已启动,并在达到预定义的执行次数时自行停止:110

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)

评论

1赞 Amro 6/6/2014
您可以改为设置 .计时器函数只是每个间隔要执行的代码。t.TasksToExecute = 10
0赞 Luis Mendo 6/6/2014
@Amro不错!这是我第一次在Matlab中使用。我错过了那个财产。谢谢;我已经更新了我的答案timer