Matlab中的While循环

Matlab中的While循环,matlab,while-loop,Matlab,While Loop,我有一段代码试图迭代k值,直到它收敛(即,后续迭代之间的距离小于一定距离)。while循环必须至少运行一次:初始k{t}值已经计算出来,while循环的第一次迭代提供了第一个k{t+1},理论上这可能在while循环中指定的距离内 上面的代码可以工作,但效率很低。所以我真的在寻找最佳实践/效率提升 目前,k在第一行上设置为k_1。如果需要更多的迭代,这很好,但是如果第一个k_1是收敛的,那么以这种方式设置代码将需要一个不必要的额外循环 理想情况下,我会有一个结构,它是do_while,而不是wh

我有一段代码试图迭代k值,直到它收敛(即,后续迭代之间的距离小于一定距离)。while循环必须至少运行一次:初始k{t}值已经计算出来,while循环的第一次迭代提供了第一个k{t+1},理论上这可能在while循环中指定的距离内

上面的代码可以工作,但效率很低。所以我真的在寻找最佳实践/效率提升

目前,k在第一行上设置为k_1。如果需要更多的迭代,这很好,但是如果第一个k_1是收敛的,那么以这种方式设置代码将需要一个不必要的额外循环

理想情况下,我会有一个结构,它是do_while,而不是while_do,因为它是在Matlab中设置的。这样,它将计算初始k_{t+1},然后测试条件。因此,如果它在第一个循环上收敛(事实上,很多循环似乎都收敛),那么它只会循环一次

我可以通过使用一个if结构来解决这个问题,告诉它如果满足了收敛条件,就可以中断,否则就设置k_t=k_{t+1}。但这似乎相当复杂,可能会增加计算负担,更不用说每次循环只需进行一次收敛性测试就要进行两次


在这种情况下,什么是最佳的matlab解决方案?

您无法对该循环进行矢量化,因为您需要
k_1
在每次迭代时计算
k
,为此,您需要执行循环中的步骤

在matlab中,您可以矢量化并行循环,这样效率更高,但在这种情况下,您有一个普通的旧循环,对此您无能为力

另外,不要担心迭代次数的减少或增加。除非运行在内部的计算非常昂贵,否则一次迭代不会产生任何影响

但是,尝试将
eye(p)
zero(p,1)
存储在
之外,而
。我担心Matlab会在每次迭代时分解变量并分配内存,这是非常昂贵的。因为
p
是固定的,所以可以将它们存储在变量中并迭代使用。
实际上,您似乎可以在循环内部完全避免计算
y_ridge

您说您的
while
循环“工作但效率低下”。您的问题本质上是关于如何避免在上一次迭代中进行不必要的计算吗?为了重新安排计算顺序,您可以尝试在
while
循环之外为第一次迭代获取一些位,并在之前对它们进行评估。啊,是的,我可以在k{t+1}循环之外进行第一次计算,并且只有在需要进一步迭代时才进入while循环,这可能会有所帮助。但是不必要的循环问题只会从k{t+1}迭代转移到k{t+2}迭代(当需要迭代时)。如果他们只允许Matlab中的do/while循环,那就简单多了!我的意思不一定是把整个迭代都带到循环之外——只要足够让它开始就行了。然后,您需要了解如何在
while
循环中对行重新排序。因为您的示例代码不可运行,所以我不打算自己玩,看看这样的事情是否可行。
k_1=100;

while (abs(k_1-k)>0.0001) 

k=k_1;
y_hat=x*b;
r=(y-y_hat);
s_squared=norm(r)/(n-p-1);

k_1=p*s_squared/(b'*b);
pseudo = sqrt(k_1) * eye(p);
x_ridge  = [x;pseudo];
y_ridge  = [y;zeros(p,1)];

b = x_ridge\y_ridge;


end