这个算法可以简化(书写更清晰)吗?

我有这个算法,但我并不太热衷于很多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

回答:

我不知道Matlab的语法,但通常是这样的:

if (cond1) then 

mainAction

else if (cond2) then

mainAction

else

otherAction

可以简化为:

if (cond1 OR cond2) then 

mainAction

else

otherAction

OR将不得不short-circuiting为一个确切的,但如果cond2没有副作用,那么它并不重要。

回答:

这可以通过注意到,只要你做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

以上是 这个算法可以简化(书写更清晰)吗? 的全部内容, 来源链接: utcz.com/qa/266973.html

回到顶部