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
  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}$$ 之后使用符号 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=fun(x,y).*ff(x,y);

于 2013-03-21T21:02:35.367 回答
0

看起来您需要将 i 和 j 设为第三维和第四维,这样代码才有可能正常工作。

我也没有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 是如何工作的。但是如果你用简单的“sum(sum(fun([1,2,4],[3,-1,2]))) 替换integral2,那么它就可以按照该操作的预期工作(也就是说,它求和在 x 和 y 值上,结果是一组索引上的矩阵)。

于 2013-03-22T01:59:18.290 回答