2015-08-24 1 views
0

Je veux parcourir tous les éléments de ma matrice et je veux qu'ils s'arrêtent quand la valeur converge de tous les éléments. J'ai écrit le code (ci-dessous) mais il me donne de mauvaises valeurs et je ne pense pas si les valeurs sont en cours dans la boucle.Arrêt de l'itération de tous les éléments d'un vecteur à la convergence dans matlab?

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 
+0

Je pense que votre tableau ne convergera jamais vers zéro et fonctionnera donc toujours. Essayez d'augmenter le seuil ou d'inclure un nombre maximum d'itérations dans votre condition de boucle de temps. – Adriaan

+0

@Visser J'ai essayé de le faire. les valeurs n'allaient pas dans la boucle d'abord mais en utilisant la norme (ancienne - nouvelle) ils sont. Mais maintenant je reçois des valeurs dans Inf ou NaN: s –

+0

Tij et Tji sont des scalaires. Les multiplier par une probabilité donne un tableau contenant 2048 valeurs qui sont exactement les mêmes. La soustraction de ces deux tableaux donne à nouveau un tableau d'éléments de 2048 avec exactement les mêmes entrées. Ce n'est que lorsque vous assignez p dans la boucle while que les choses commencent à changer, fournissant StateTransitionbwd est un tableau 2048 de valeurs distinctes. – Adriaan

Répondre

0

Vous arrêter état old - new > threshold est problématique, car il n'est pas évaluée en une valeur booléenne scalaire , mais à un vecteurde valeurs booléennes.
Vous devriez plutôt mesurer la norme du vecteur de différence, par exemple

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

Ou

while norm(old-new) > threshold 
+0

La boucle a fonctionné et les valeurs vont dans la boucle au moins. Mais la sortie est NaN ou Infinty négative: s –

0

Il me semble que votre ancien vecteur pourrait être le vecteur 0 aussi bien. Si vous obtenez une erreur de NaN ou inf en testant la condition de la boucle, c'est parce que vous essayez de trouver la norme du vecteur zéro avec la norme (old-new). La norme d'un vecteur est calculée par v/|| v || donc si || v || est 0, votre vecteur sera NaN.