2011-11-27 6 views
0

Je voudrais savoir s'il existe un moyen de vectoriser ce code. J'ai tellement essayé de le faire ... mais j'ai échoué.While Vectorisation en boucle

while (delta_F > e) && (i < maxLoop)  
    x1 = x0+d; 
    y0 = f(x0); 
    y1 = f(x1); 
    if y1 < y0 
     x0= x1; 
     d = a*d; 
    else 
     vF = [vF;x1]; 
     d = -b*d; 
    end 
    i = i + 1; 
    if length(vF) > 1 
     ultm = vF(end); 
     pultm = vF(end-1); 
     delta_F = abs(ultm+pultm)/2; 
    end 
end 

C'est une implémentation simple de la méthode Rosenbrock pour trouver la min d'une fonction.

+1

Il serait utile si vous pouviez nous dire ce que la boucle est supposée faire - pouvez-vous l'écrire comme une formule? En outre: Quelles sont les valeurs d'initialisation de toutes ces variables? – Thilo

Répondre

2

En général, la vectorisation de Matlab fonctionne sur des matrices/matrices de taille fixe. Si vous voulez accélérer ce code d'une autre manière, la seule chose que vous pourriez faire est de réutiliser vos résultats précédents dans chaque itération de la boucle et de vous débarrasser des variables superflues.

y0 = f(x0); 
while (delta_F > e) && (i < maxLoop) 
    x1 = x0+d; 
    y1 = f(x1); 
    if (y1 < y0) %# new starting point, so swap points 
     x0 = x1; 
     y0 = y1; 
     d = a*d; 
    else   %# same starting point, refine step and see if we're done 
     d = -b*d; 
     delta_F = abs(x1-x0)/2; 
    end 
    i = i+1; 
end 

Cela supprime la moitié des appels à f et le redimensionnement dynamique de vF, qui est affreusement lent, d'autant plus que vF obtient grand.

+0

Je n'ai pas regardé assez près pour voir si ceci produit le même résultat que le code original, mais +1 pour se débarasser du redimensionnement dynamique et de la pénalité temporelle quadratique résultante! –