【问题标题】:Storing the number of iterations of a nested loop in an array将嵌套循环的迭代次数存储在数组中
【发布时间】:2014-12-04 18:39:52
【问题描述】:

我对 MATLAB 比较陌生,而且我很容易陷入一个特定的问题。

我有一个方程式,我试图使用 while 循环求解。它通过猜测某个参数 e_0 并将其填充到方程中来工作,直到它收敛。下面是一个示例,其中初始猜测值等于 100:

clear all
i=1;
e_0=100
e_1= e_0 + log(0.6) - log(exp(e_0)/(exp(e_0)+1))

    while( i < 1e10 & abs((e_1 - e_0)) > 1e-12),
         i = i + 1;
         e_0=e_1;
         e_1= e_0+log(0.6)-log(exp(e_0)/(exp(e_0)+1))
    end 
i

现在我想要完全相同的程序,但同时处理多个 e_0 值,例如101, 102, 103 等等,并计算需要多少次迭代。我认为我因此需要为此放置一个 for 循环。我的想法是这样的:

clear all
i=1;

for e_0 = 100:105
e_1= e_0+log(0.6)-log(exp(e_0)/(exp(e_0)+1))
    while( i < 1e10 & abs((e_1 - e_0)) > 1e-12),
         i = i + 1;
         e_0=e_1;
         e_1= e_0+log(0.6)-log(exp(e_0)/(exp(e_0)+1))
    end 
end
  i

但是,现在来自不同猜测值的所有迭代都显示在彼此下方,我总共得到 1519 次迭代。例如,如何将每个初始猜测值所需的迭代次数存储到一个变量中?

我希望它足够清楚......谢谢!

【问题讨论】:

    标签: matlab loops for-loop while-loop nested


    【解决方案1】:

    这个怎么样:

    i = 0;
    offset = 99;
    for n = 1:6
    e_0 = n + offset;
    e_1 = e_0+log(0.6)-log(exp(e_0)/(exp(e_0)+1))
        while( i < 1e10 & abs((e_1 - e_0)) > 1e-12),
            i = i + 1;
    

    这部分需要更改以防止e_0在循环内被重新定义:

            e_1= e_1+log(0.6)-log(exp(e_1)/(exp(e_1)+1)) 
        end 
        iterations(n)=i;
    end
    

    注意:不建议使用i作为循环增量,因为它重新定义了复数中使用的i

    【讨论】:

    • 非常感谢您的快速回复!但是,我确实收到一条错误消息:“尝试访问 (0.405465);索引必须是正整数或逻辑整数。”
    • @user3594343 那是因为你在嵌套循环中覆盖了 for 循环的循环变量。你真的不想那样做。请改用其他变量。
    • @user3594343 您应该将i 初始化为零,否则您的循环计数将从 2 开始计数。
    • @CapeCode 谢谢!我只是不能 100% 确定我是否可以跟随。例如,我现在可以看到不同的初始 e_0 需要多少次迭代吗?
    • @user3594343 在for-循环的每次迭代结束时,i 将被写入数组iterations 的第 n 个元素,所以是的。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2016-05-20
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2016-11-05
    相关资源
    最近更新 更多