2010-07-17 6 views
2

J'ai cet algorithme, mais je ne suis pas trop intéressé par les nombreuses if-statements. Est-ce que quelqu'un peut voir si cette fonction peut être écrite de manière plus propre?Cet algorithme peut-il être simplifié (nettoyeur écrit)?

rand('twister',101) 

n = 10; 
f = A.^(0:n)./factorial(0:n); 
f = f/sum(f); 
n = 10000; 
Xi = 2; 
X = zeros(1,n); 

for i =1:n, 
    dXi = (-1)^round(rand); 
    Yi = Xi + dXi; 
    if Yi > 0 & Yi <= length(f), 
     if f(Yi) >= f(Xi), 
      X(i) = Yi; 
      Xi = Yi; 
     else 
      if rand <= f(Yi)/f(Xi), 
       X(i) = Yi; 
       Xi = Yi; 
      else 
       X(i) = Xi; 
      end 
     end 
    end 
    X(i) = Xi; 
end 
+0

Que faut-il faire? Peut-être que c'est déjà aussi simple que possible compte tenu des exigences. –

+1

Le X (i) = Xi à la fin de la boucle ressemble à un bug. Si ce n'est pas le cas, il y a beaucoup de choses inutiles dans les ifs imbriqués où X (i) est temporairement assigné à quelque chose d'autre, puis jamais utilisé. Vous pouvez simplifier cela pour une instruction if qui définit Xi = Yi. –

+0

Le dernier X (i) = Xi est destiné. Mais je ne vous suis pas tout à fait, ce qui n'est jamais utilisé? –

Répondre

1

Je ne sais pas la syntaxe Matlab, mais généralement quelque chose comme ceci:

if (cond1) then 
    mainAction 
else if (cond2) then 
     mainAction 
    else 
     otherAction 

peut être simplifiée comme:

if (cond1 OR cond2) then 
    mainAction 
else 
    otherAction 

Le OR devrait être short-circuiting d'équivalence exacte , mais si cond2 n'a pas d'effets secondaires, cela n'a pas vraiment d'importance.

1

Cela peut être simplifié en notant que chaque fois que vous faites X(i) = Yi vous faites aussi Xi = Yi et donc vous pouvez simplement assigner X (i) une fois à la fin de la boucle. Cela permet de simplifier beaucoup l'autre logique.

Notez également que le , à la fin d'une clause if est vraiment seulement nécessaire dans une ligne si des instructions, par ex.

if x < y, do_something, else do_something_else, end 

Quoi qu'il en soit je reçois ce (vous pouvez simplifier davantage dans une instruction if, mais peut-être est moins clair aussi avoir plus d'une instruction if permet des points d'arrêt sur des sections particulières..):

for i =1:n, 
    dXi = (-1)^round(rand); 
    Yi = Xi + dXi; 
    if Yi > 0 & Yi <= length(f) 
     if f(Yi) >= f(Xi) || rand <= f(Yi)/f(Xi) 
      Xi = Yi; 
     end 
    end 
    X(i) = Xi; 
end 
Questions connexes