这个算法可以简化(写得更干净)吗?

时间:2010-07-17 21:14:32

标签: matlab octave

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

这可以通过注意每当你执行X(i) = Yi Xi = Yi时也可以简化,因此你可以在循环结束时分配一次X(i)。这允许许多其他逻辑简化。

另请注意,if-clause末尾的,实际上只在单行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