2010-07-17 4 views
2

이 알고리즘이 있지만 많은 if 문을 너무 좋아하지 않습니다.이 알고리즘을 단순화 할 수 있습니까?

이 기능이 더 깨끗한 방식으로 작성 될 수 있는지 누가 알 수 있습니까?

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

무엇을합니까 해야 할 것? 이미 요구 사항을 고려할 때 가능한 한 간단 할 수 있습니다. –

+1

루프 끝의 X (i) = Xi는 버그처럼 보입니다. 그것이 아니라면 X (i)가 일시적으로 다른 것으로 할당 된 후 사용되지 않는 중첩 된 if에 많은 불필요한 것들이 있습니다. Xi = Yi를 설정하는 if 문 하나를 단순화 할 수 있습니다. –

+0

마지막 X (i) = Xi가 의도됩니다. 그러나 나는 결코 당신을 따르지 않는다. 사용되지 않는 것은 무엇인가? –

답변

1

내가 matlab에 구문을 잘 모르겠지만,이 같은 일반적으로 뭔가 : 정확한 동등성에 대한 short-circuiting을 할

if (cond1 OR cond2) then 
    mainAction 
else 
    otherAction 

OR는 것 :

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

은 다음과 같이 단순화 될 수있다 ,하지만 cond2에 부작용이 없다면 별 문제가되지 않습니다.

1

X(i) = Yi을 수행 할 때마다 Xi = Yi을 수행하므로 반복문 끝에 X (i)를 한 번만 할당 할 수 있습니다. 이를 통해 많은 다른 논리를 단순화 할 수 있습니다.

if 절의 끝에있는 ,은 실제로 한 줄 if 문에서만 필요합니다.

if x < y, do_something, else do_something_else, end 

어쨌든 나는이 (문이 아마도이 덜 분명하지만 경우에 당신이 일에 더 단순화 할 수 있습니다 또한 문이 특정 부분에 브레이크 포인트를 허용 하나 이상의 경우에 필요..) 얻을 :

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 
관련 문제