0
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 解决方案是什么?

4

1 回答 1

1

您不能向量化此循环,因为您需要在每次迭代时k_1进行计算k,为此您需要执行循环中的步骤。

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

此外,不要担心迭代更少或更多。除非您在其中运行的计算非常昂贵,否则一次迭代不会产生任何影响。

但是,尝试存储eye(p)zeros(p,1)外部的while. 我担心 Matlab 会破坏变量并在每次迭代时分配内存,这非常昂贵。由于p是固定的,您可以将它们存储在变量中并迭代使用它们。实际上,您似乎可以完全避免y_ridge在循环内进行计算。

于 2013-11-01T16:19:52.347 回答