2010-07-17 2518 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

這是什麼做?考慮到要求,它可能已經儘可能簡單。 – 2010-07-17 21:16:04

+1

循環結尾處的X(i)= Xi看起來像一個錯誤。如果不是這樣,嵌套ifs中有很多不必要的東西,其中X(i)暫時分配給其他東西,然後從未使用過。如果聲明設置Xi = Yi,你可以將其簡化爲一個。 – 2010-07-17 21:36:13

+0

最後的X(i)= Xi是打算的。但我不太關注你,什麼是從未用過的? – 2010-07-17 21:43:47

回答

1

我不知道Matlab的語法,但通常是這樣的:

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

可以簡化爲:

if (cond1 OR cond2) then 
    mainAction 
else 
    otherAction 

OR將不得不short-circuiting爲一個確切的,但如果cond2沒有副作用,那麼它並不重要。

1

這可以通過注意到,只要你做X(i) = Yi你也Xi = Yi簡化,因此你可以只在循環結束時分配一次X(i)。這允許很多其他邏輯簡化。

另請注意,if語句末尾的,實際上只在單行if語句中是必需的,例如,

if x < y, do_something, else do_something_else, end 

無論如何,我得到這個(你可以進一步簡化爲一個if語句,但也許這是不太清楚而且有一個以上的if語句允許在特定部分的斷點。):

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