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
我有一段代码试图迭代 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 解决方案是什么?