【问题标题】:How can I loop indefinitely, but stop on some condition(s)?我怎样才能无限循环,但在某些条件下停止?
【发布时间】:2011-05-27 18:31:59
【问题描述】:

我正在使用 MATLAB 开发一个项目。它包括连续绘制从计算机串行端口接收的有关温度的数据。我想无限地这样做,有没有办法像在 C 中那样创建无限循环?

现在 if 实现为:

while(true)
%comments
end;

如下所述,有没有办法更新标志,以便可以根据要求或任何其他操作终止它?

示例:我正在为通过 ZigBee 通信的 5 个节点绘制数据,然后如果我选择在 Axis 上绘制 4 个节点,那么在启动无限循环后有什么方法可以更改内部使用的数据循环通过MATLAB的GUI输入法或任何标志?

【问题讨论】:

    标签: matlab loops


    【解决方案1】:

    对于在满足特定条件时仍然可以轻松停止的“无限”循环,您可以将while condition 设置为可以在循环中更新的logical variable(即标志):

    keepLooping = true;   % A flag that starts as true
    while keepLooping
      % Read, process, and plot your data here
      keepLooping = ...;  % Here you would update the value of keepLooping based
                          %   on some condition
    end
    

    如果在循环中遇到breakreturn 命令,也可以终止while 循环。


    示例:

    作为一些可以停止循环的基于 GUI 的方法的示例,这里有一个程序,它创建了一个简单的 GUI,它使用 while 循环每秒连续递增并显示一个计数器。 GUI 有两种停止循环的方法:push button 或在图形窗口具有焦点时按 q(使用图形的 'KeyPressFcn' property 在按下键时运行代码)。只需将此代码保存在 MATLAB 路径上某处的 m 文件中并运行它来测试示例:

    function stop_watch
    
      hFigure = figure('Position', [200 200 120 70], ...       % Create a figure window
                       'MenuBar', 'none', ...
                       'KeyPressFcn', @stop_keypress);
      hText = uicontrol(hFigure, 'Style', 'text', ...          % Create the counter text
                        'Position', [20 45 80 15], ...
                        'String', '0', ...
                        'HorizontalAlignment', 'center');
      hButton = uicontrol(hFigure, 'Style', 'pushbutton', ...  % Create the button
                          'Position', [20 10 80 25], ...
                          'String', 'Stop', ...
                          'HorizontalAlignment', 'center', ...
                          'Callback', @stop_button);
      counter = -1;
      keepLooping = true;
      while keepLooping       % Loop while keepLooping is true
        counter = counter+1;  % Increment counter
        set(hText, 'String', int2str(counter));  % Update the counter text
        pause(1);             % Pause for 1 second
      end
    
    %---Begin nested functions---
    
      function stop_keypress(hObject, eventData)
        if strcmp(eventData.Key, 'q')            % If q key is pressed, set
          keepLooping = false;                   %   keepLooping to false
        end
      end
    
      function stop_button(hObject, eventData)
        keepLooping = false;                     % Set keepLooping to false
      end
    
    end
    

    上面的例子利用了nested functions,使得'KeyPressFcn'和按钮回调可以访问和修改stop_watch函数工作区中keepLooping的值。

    【讨论】:

    • 请注意,如果没有pause,这将无法工作(没有pause,它将完成循环,然后处理排队的回调事件,从而达到目的)。请注意,实际处理队列的是drawnow 命令,而pause 调用drawnow(或等效的),因此出于可读性原因,最好在pause 旁边显式添加drawnow
    • 我遇到了这个问题,因为我使用了一种更准确的等待方式,基于java.lang.Thread.sleep(..)Object.wait(..)java.lang.Thread.yield(),这与pause不同,因为这些方法确实不包括对drawnow(或同等学历)的附带电话。
    【解决方案2】:
    while (true)
        % block of code here
    end
    

    【讨论】:

    • 太棒了!几乎像所有其他语言一样:)
    • 你说的是如何永远循环,而不是如何跳出循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2023-03-18
    • 2013-08-18
    • 2020-08-24
    相关资源
    最近更新 更多