【问题标题】:In a while loop, whenever a condition is fulfilled, change a certain parameter inside the loop在while循环中,只要满足一个条件,就改变循环内的某个参数
【发布时间】:2018-08-03 15:12:48
【问题描述】:

我有一个 while 循环,我想将参数“rate”乘以 2,只要“fitval”连续 3 次以上(迭代)分配相同的值。 Fitval 可以在每次迭代中随机取值 1、2、3、4 和 5。

例如,如果 fitval 被分配了两次相同的值,但第三次它变成了一个新值,我希望计数器“重置”,这样我们需要再次迭代 3 次,然后才能将“速率”翻倍。

我编写了一个似乎可以解决问题的代码,见下文。我想知道是否有更优雅的方式来实现这一点。任何提示将不胜感激!

i=2;
k=1;
rate=0.5;
fitval=[nan];

while i<15
    fitval=[fitval;randi(5)];

    if fitval(i)==fitval(i-1)
        k=k+1;
    else
        k=1;
    end
    if k==3
        rate=2*rate;
    end 
    i=i+1;
end
fitval
rate

【问题讨论】:

  • 你的问题是什么,错误?您的代码似乎正在运行...此站点不适用于代码优化
  • 您可以在while循环之前生成随机数组,然后您只需搜索3个相似的值。这样会更简单。
  • 代码可以精简一点,不过这对codereview来说更重要

标签: matlab loops while-loop conditional-statements


【解决方案1】:

您的代码可以工作,但如果这是您要查找的内容,这会稍微紧凑:

while i<15
    fitval(end+1) = randi(5);
    if length(fitval) >= 3 && ...
            all(fitval(end) == [fitval(end-1), fitval(end-2)])
        rate=2*rate;
    end
    i = i+1;
end

【讨论】:

    【解决方案2】:

    看起来你正在做的事情很好。由于您需要知道是否连续给出了 3 次相同的值,因此您必须计算它们是很自然的。没办法。

    如果你真的很挑剔,我可以建议一些事情:

    只是风格问题,但我会替换

    fitval=[fitval;randi(5)];
    if fitval(i)==fitval(i-1)
    

    newValue = randi(5);
    fitval=[fitval;newvalue];
    if(newValue == fitval(i-1))
    

    我认为它不是更有效,但更容易阅读(我喜欢逐行使用单数指令)。

    另外,由于您事先知道 fitval 的最终长度,您可能应该在创建时声明它,以便一劳永逸地分配空间。它当然更有效(但也无所谓仅 15 次迭代)。

    【讨论】:

    • 非常感谢您的回复。在实际示例中,不知道 fitval 的最终长度,代码一直运行到我用 while 1=1 终止它。我在这里发布了一个精简的简化版本。再次感谢您的回复!
    • 抱歉,我通常不会对答案投反对票,但这很糟糕,甚至是错误的。
    • 在第一部分中,您声明需要有一个计数器。这是错误的,可以使用带有多个条件的 if 语句,然后就不需要计数器了。第二部分,您使代码“更具可读性”。正如您所说的那样,这是您自己的偏好,但对我来说,您使它的可读性降低了很多。但如前所述,这是偏好。然而,OP 要求让它更优雅,这通常意味着更短而没有不必要的冗余。引入一个新的、不必要的变量似乎起到了相反的作用。
    • 另外,如果您想称呼某人,请务必标记他们。我只是因为忘记关闭浏览器而阅读此内容。所以如果我关闭它,我永远不会知道你问我一个问题。
    猜你喜欢
    • 2017-03-04
    • 2015-06-18
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多