Можно ли упростить этот алгоритм (написано чище)? - PullRequest
2 голосов
/ 18 июля 2010

У меня есть этот алгоритм, но я не слишком заинтересован во многих операторах 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 ]

1 голос
/ 18 июля 2010

Это можно упростить, заметив, что всякий раз, когда вы делаете X(i) = Yi, вы также делаете Xi = Yi, и поэтому вы можете просто назначить X (i) один раз в конце цикла.Это позволяет упростить множество другой логики.

Также обратите внимание, что , в конце предложения if действительно необходимо только в однострочных операторах if, например,

if x < y, do_something, else do_something_else, end 

В любом случае я получаю это (вы могли бы еще больше упростить до одного оператора if, но, возможно, это не так понятно. Также наличие более одного оператора if допускает точки останова в определенных разделах.)

1 голос
/ 18 июля 2010

Я не знаю синтаксис Matlab, но обычно что-то вроде этого:

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

можно упростить как:

if (cond1 OR cond2) then
   mainAction
else
   otherAction

OR должно быть короткое замыкание для точной эквивалентности, но если cond2 не имеет побочных эффектов, то это не имеет значения.

...