在matlab中收敛时停止向量的所有元素的迭代?

时间:2015-08-24 08:06:06

标签: matlab loops iteration convergence

我想迭代矩阵中的所有元素,并希望它们在所有元素的值收敛时停止。我写了代码(下面),但它给了我错误的值,我不认为值是否实际上在循环中。

probability = (ones(1,2048) .* 1/2048); %vector of 2048 values
Tij = sum(StateTransitionfwd); %vector of 2048 values
Tji = sum(StateTransitionbwd); %vector of 2048 values
p = ((Tji .* probability) - (Tij .* probability)); %vector of 2048 values

threshold = (zeros(1,2048)); %vector of 2048 values
old = p; %vector of 2048 values
new = zeros(1,2048); %vector of 2048 values

while old - new > threshold %subtracting vector from the vector    
   old = p;     
   p = ((p * StateTransitionbwd) - (Tij .* p));     
   new = p;        
end 

2 个答案:

答案 0 :(得分:0)

您停止条件old - new > threshold是有问题的,因为它不会被评估为标量布尔值,而是评估为布尔值的向量
您应该测量差异向量的范数,例如

while max( abs( old-new) ) > threshold

或者

while norm( old-new) > threshold

答案 1 :(得分:0)

在我看来,你的旧矢量也可能是0矢量。如果在测试循环条件时遇到NaN或inf的错误,那是因为你试图用norm(old-new)找到零向量的范数。矢量的范数由v / || v ||计算所以,如果|| v ||是0,你的矢量将是NaN。