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
4

2 回答 2

1

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

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

可以简化为:

if (cond1 OR cond2) then
   mainAction
else
   otherAction

为了精确等效,OR必须短路cond2,但如果没有副作用,那就没关系了。

于 2010-07-17T21:35:54.017 回答
1

这可以通过注意无论何时你X(i) = Yi也这样做来简化Xi = Yi,因此你可以在循环结束时分配一次 X(i) 。这允许简化许多其他逻辑。

另请注意,,if 子句末尾的 the 实际上仅在单行 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
于 2010-07-18T13:36:20.357 回答