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

X(i) = Yiこれは、実行するときはいつでも実行するXi = Yiため、ループの最後にX(i)を1回割り当てるだけでよいことに注意することで簡略化できます。これにより、他の多くのロジックを単純化できます。

,また、if句の最後にあるのは、実際には1行のifステートメントでのみ必要であることに注意してください。

if x < y, do_something, else do_something_else, end 

とにかく私はこれを取得します(さらに1つの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 に答える
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 に答える