1

$$\int_{-\infty}^a \int_{-\infty}^b \sum_{i,j}^K a_ia_jx^iy^j\exp(-x^ 2 - y^2 + xy)dx dy $$

$a_i$ と $a_j$ は定数です。積分は線形であるため、和と積分を入れ替えることができますが、この場合、$K^2$ 積分を評価する必要があり、時間がかかりすぎます。その場合、私は次のことを行います。

for i = 1:K
   for j = 1:K
       fun = @(x,y) x.^i.*y.^j.*exp(-2.*(x.^2 + y.^2 - 2.*x.*y))
       part(i,j) = alpha(i)*alpha(j)*integral2(fun,-inf,a,-inf,b)
   end
end

時間がかかりすぎるので積分を一つだけ評価したいのですが $\sum_{i,j}^K a_ia_jx^iy^j\exp(-x^2 - y^2 + xy)$、つまり、integral2 への供給方法です。どんな助けにもとても感謝しています。

4

2 に答える 2

0

コードが機能する可能性があるためには、i と j を 3 次元と 4 次元にする必要があるようです。

また、integral2 も持っていません (私は octave を使用します。integral2 は octave にはまだない新しい matlab 関数です)、テストすることはできませんが、次のようなものがうまくいくと思います:

alphaset=zeros(1,1,K,K);
alphaset(1,1,1:K,1:K)=alpha(1:K)'*alpha(1:K);
i_set=zeros(1,1,K,1);
j_set=zeros(1,1,1,K);
i_set(:)=1:K;
j_set(:)=1:K;
fun=@(x,y)  x.^i_set.*y.^j_set.*exp(-2.*(x.^2 + y.^2 - 2.*x.*y));
part = squeeze(alphaset.*integral2(fun,-inf,a,-inf,b));

前述したように、integral2 がどのように機能するかを知らないため、機能することを約束することはできません。しかし、integral2 を単純に "sum(sum(fun([1,2,4],[3,-1,2])))" に置き換えると、その演算の意図どおりに機能します (つまり、 x と y の値で、結果は一連のインデックスの行列です)。

于 2013-03-22T01:59:18.290 に答える
0
  1. 速度を向上させたいだけなら、parfor を試すことができます。

  2. $X=(x,x^2,\cdots,x^K)$, $Y=(y,y^2,\cdots,y^K)$, $A=(a_{ij})$ とする$a_{ij}=a_{i}a_{j}$ の行列、次に $$\sum_{i,j}^K a_{i}a_{j}x^iy^j=XAY^{T} $$

私のmatlabにはintegral2関数がないので、速度が大幅に向上するかどうかはテストしませんでした。

また、$$XAY^{T}$$ を計算した後、syms x と y を使用する必要があると思います。次に、matlabFunction を使用してシンボリック式を関数ハンドルに変換します。これが私のテストコードです: syms xy; X=[x,x^2]; Y=[y,y^2]; Z=X*Y'; 楽しい =matlabFunction(Z); ff=@(x,y) x^2+y^2; gg=楽しい(x,y).*ff(x,y);

于 2013-03-21T21:02:35.367 に答える