Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在while循环中,只要满足一个条件,就在循环中更改某个参数_Matlab_Loops_While Loop_Conditional Statements - Fatal编程技术网

Matlab 在while循环中,只要满足一个条件,就在循环中更改某个参数

Matlab 在while循环中,只要满足一个条件,就在循环中更改某个参数,matlab,loops,while-loop,conditional-statements,Matlab,Loops,While Loop,Conditional Statements,我有一个while循环,在这个循环中,只要一行中“fitval”被赋予相同的值超过3次(迭代),我就想将参数“rate”乘以2。 Fitval可以在每次迭代中随机取值1、2、3、4和5 例如,如果fitval被赋予了两次相同的值,但第三次它变成了一个新值,我希望计数器“重置”,这样我们需要在“速率”加倍之前再次进行3次迭代 我写了一个代码,似乎做到了这一点,见下文。我想知道是否有一种更优雅的方式来实现这一点。任何提示都将不胜感激 i=2; k=1; rate=0.5; fitval=[nan];

我有一个while循环,在这个循环中,只要一行中“fitval”被赋予相同的值超过3次(迭代),我就想将参数“rate”乘以2。 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
i=2;
k=1;
比率=0.5;
fitval=[nan];

而我看起来你所做的一切都很好。因为您需要知道同一个值是否连续给出了3次,所以您自然需要对它们进行计数。没办法

如果你真的想挑剔,我可以提出以下建议:

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

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

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


另外,由于您预先知道fitval的最终长度,您可能应该在创建时声明它,以便一次性地分配空间。它当然更高效(但也不影响只进行15次迭代)。

您的代码可以工作,但这稍微更紧凑一些,如果这正是您想要的:

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
当i=3&&。。。
全部(fitval(end)=[fitval(end-1)、fitval(end-2)])
比率=2*比率;
终止
i=i+1;
终止

您的问题和错误是什么?您的代码似乎正在运行。。。此站点不用于代码优化。您可以在while循环之前生成随机数组,然后只搜索3个类似的值。这将使它更简单。代码可以压缩一点,但这更像是一项工作,非常感谢您的回复。在实际示例中,fitval的最终长度是未知的,代码一直运行到我以while 1=1终止它为止。我在这里发布了一个精简版。再次感谢您的回复!对不起,我通常不会对答案投反对票,但这是不好的,在某种程度上甚至是错误的。在第一部分中,您声明需要有一个计数器。这是错误的,可以使用带有多个条件的if语句,然后就不需要计数器了。第二部分,使代码“更具可读性”。这就像你自己说的,但对我来说,你让它变得不那么可读。但正如前面提到的,这是偏好。然而,OP要求使它更优雅,这通常意味着更短而不需要多余的冗余。引入一个新的、不需要的变量似乎起到了相反的作用。此外,如果您想称呼某人,请确保标记他们。我读这篇文章只是因为我忘了关闭浏览器。所以如果我真的关上它,我就不会知道你问了我一个问题。
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