2

依存関係の for ループのベクトル化について複雑な問題を抱えています。

X1長さ のベクトル、長さn1X2ベクトルn2、x行列、F1x行列、x行列としましょう。表記はインデックス ベクトルです。ntrapz は、台形数値積分の関数です。次のように行列を計算したいと思います。N1n1F2N2n2QN1N2p...Q

for i1=1:N1
    F1_13tmp=F1(i1, p1_13)';                       % ' 
    F1_13=F1_13tmp(:,ones(n2,1));
    for i2=1:N2
        F2_13 = F2(i2, p2_13);
        Q_13_13 = Q(p1_13, p2_13);
        Q(i1,i2) = Q(i1,i2) + 
              ntrapz(X2(p2_13), ntrapz(X1(p1_13)', Q_13_13.*F1_13).*F2_13);
    end
end

問題は、更新によって次の反復Q(i1,i2)の値が変更されることです。Q_13_13 = Q(p1_13, p2_13)そのような for ループをベクトル化できるかどうか知りたいです。そうでない場合、コードを高速化するためのアイデアはありますか?

よろしくお願いいたします。

4

1 に答える 1

0

ベクトル化は、通常、並列操作の方法です。ただし、あなたの場合、順次操作があり、それらは一般にベクトル化には適していないようです。

私はあなたが使用する関数に精通していませんが、計算を高速化するために考えられる唯一の方法は、それを非依存形式で記述することです。これはプログラミングの演習というよりも数学の演習であることに注意してください。ここに簡単な例を示します。

式が次と等しいとします。

Y(1)=0.5;
Y(t)=0.3*Y(t-1)+epsilon(t);
% Let as assume epsilon is also known
epsilon = rand(9,1)

Y(10) を計算する簡単な方法は、10 の計算ステップを実行することです。

for t=2:10
    Y(t)=0.3*Y(t-1)+epsilon(t);
end

Y(10) を計算する最速の方法は、次のようにすることです (正しいかどうかはわかりませんが、近いはずです)。

Y(10)=Y(1)*0.3^9 + sum(epsilon.^(1:9))

結論として、ループを「ベクトル化」する唯一の方法は、コンピューターを大幅に支援し、基本的に別の計算を実行させることです。これが不可能な場合は、もちろん、mex ファイルにすることで、少し余分な速度を絞り出すことをいつでも試みることができます。

于 2012-12-05T10:31:57.017 に答える