【问题标题】:MATLAB - Count if for loop conditions are trueMATLAB - 如果for循环条件为真,则计数
【发布时间】:2013-03-05 05:11:26
【问题描述】:

在使用计时器对象时,我有一个关于在 for 循环中计算条件为真的次数的问题。所以我设置我的计时器对象每 60 秒调用一次这个函数,如果 X 和 Z 等于 1,它将检查我在数据库中的条件,然后它会做一些事情。问题是我希望它每次 X 和 Z 都等于 1 时计数,因为我有另一个程序每秒更改 X 和 Z 的值。如果计数等于 1、2 和 3,它会做不同的事情。当我运行它时,即使 X 和 Z 多次等于 1,它也不会超过 1。以下是我的代码

a = timer('ExecutionMode', 'fixedRate','TimerFcn', 'func(1)', 'Period', 60);
start(a);


function [x] = func(y)
count = 0;
if x == y && z == y
count = count +1;
if count == 1
    disp('1')
elseif count == 2
    disp('2')
elseif count == 3
    disp('3')  
end
else
disp('same')
end

【问题讨论】:

    标签: matlab loops for-loop timer count


    【解决方案1】:

    您的主要问题是 count 变量具有函数局部范围,因此每次调用函数时都会创建它,并在函数结束时销毁它。您需要它在调用函数之间保持不变。一种可能性是将count 变量设为全局变量:

    global count;
    count = 0;
    
    a = timer('ExecutionMode', 'fixedRate','TimerFcn', 'func(1)', 'Period', 60);
    start(a);
    
    function func(y)
    global count;
    if x == y && z == y
        count = count + 1;
        disp(num2str(count));
    else
        disp('same');
    end
    

    此代码还用对disp 的一次调用替换了发出各种disp 调用的if 结构。如果您打算打印出计数,这是一种更好的方法。

    【讨论】:

      【解决方案2】:

      您没有以 end 结束第一个 if 语句。因此,如果 count == 1 以及随后的所有内容仅在 x== y && z == y 时执行

      关闭你的第一个 if 语句,你的代码应该可以工作了:

      if x == y && z == y
        count = count +1;
      end
      if count == 1
      ...
      

      另请注意,在您编写代码时,每次进入函数时都会将 count 重置为 0,这意味着 count=count+1;将永远是 count = 0 + 1 = 1;

      【讨论】:

      • 感谢您的回复!是的,每次定时器回调这个函数时,count = count + 1 总是等于 1。我不确定如何设置它以便下次计时器回调并且条件为真,count = 2
      • 答案很简单:不要在函数本身中将其重置为 0。在调用函数中设置它并将其作为参数传递给 func 并每次从 func 检索它(即 function [x,count] = func(y,count))或将 count 设为全局。但无论采用哪种方法,都不要在函数本身中将计数设置为零,否则您最终会每次都重置该计数器。
      【解决方案3】:

      如果你想计算你进入一个函数的次数,你必须让计数器变量持久化,否则每次调用都会被设置为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多