0

我在 MATLAB 中使用数值积分,用一个变量进行积分,但该函数还包含可变数量的项,具体取决于我的数据维度。现在这对于二维情况如下所示:

for t = 1:T  
   fxt = @(u)  exp(-0.5*(x(t,1)-theta*norminv(u,0,1)).^2) .* ...
         exp(-0.5*(x(t,2) -theta*norminv(u,0,1)).^2);
   f(t) = integral(fxt,1e-4,1-1e-4,'AbsTol',1e-3); 
end

我希望这个功能灵活,因为可以有任意数量的数据点,每个数据点都在以下术语中:

exp(-0.5*(x(t,i) -theta*norminv(u,0,1)).^2);

我希望这是可以理解的。

4

2 回答 2

0

如果x并且u有一个有效的减法维度匹配(向量-向量或数组-标量),您可以将整个矩阵放入句柄并使用名称-参数对 ( , )x将其传递给函数:integral'ArrayValued'true

fxt = @(u)  exp(-0.5*(x - theta*norminv(u,0,1)).^2) .* ...
            exp(-0.5*(x - theta*norminv(u,0,1)).^2);
f   = integral(fxt,1e-4,1-1e-4,'AbsTol',1e-3,'ArrayValued',true);

[文档]

integral如果将向量传递u到句柄中,您可能需要一个循环。但是在查看integral函数的编写方式时,积分节点是作为数组值函数的标量输入的,因此除非抛出一些奇怪的维度不匹配错误,否则不需要循环。



数组值输出

针对以下评论,您可以尝试使用此函数句柄:

fx = @(u,t,k)  prod(exp(-0.5*(x(t,1:k)-theta*norminv(u,0,1)).^2),2);

然后你当前的循环看起来像

fx = @(u,t,k) prod(exp(-0.5*(x(t,1:k)-theta*norminv(u,0,1)).^2),2);
k  = 2;
for t = 1:T
  f(t) = integral(@(u)fx(u,t,k),1e-4,1-1e-4,'AbsTol',1e-3,'ArrayValued',true);
end

ArrayValued标志是必需的,因为x它将u具有尺寸不匹配。在这种形式中,需要另一个循环来扫描k索引。但是,我们可以通过完全跳过循环来改进此功能,因为循环的每次迭代都是独立的,使用以下ArrayValued模式:

fx = @(u,k) prod(exp(-0.5*(x(:,1:k)-theta*norminv(u,0,1)).^2),2);
k  = 2;
f  = integral(@(u)fx(u,k),1e-4,1-1e-4,'AbsTol',1e-3,'ArrayValued',true);


向量值输出

如果ArrayValued不需要,如果集成需要大量细分并且向量值u更可取,则可能是这种情况,您还可以尝试使用元胞数组的递归版本句柄:

% x has size [T,K]
fx = cell(K,1);
fx{1} = @(u,t) exp(-0.5*(x(t,1) - theta*norminv(u,0,1)).^2);
for k = 2:K
    fx{k} = @(u,t) fx{k-1}(u,t).*exp(-0.5*(x(t,k) - theta*norminv(u,0,1)).^2);
end

f(T) = 0;
k    = 2;
for t = 1:T
    f(t) = integral(@(u)fx{k}(u,t),1e-4,1-1e-4,'AbsTol',1e-3);
end
于 2014-10-23T20:10:35.407 回答
0

谢谢特洛伊,但现在我遇到了以下情况:

x = [0.3,0.8;1.5,-0.7];
T = size(x,1);
k  = size(x,2);
theta= 1;
fx = @(u,t,k) prod(exp(-0.5*(x(t,1:k) - theta*norminv(u,0,1))^2));
for t = 1,T
  f(t) = integral(@(u)fx(u,t,k),1e-4,1-1e-4,'AbsTol',1e-3);
end

使用错误 - 矩阵尺寸必须一致。

@(u,t,k)prod(exp(-0.5*(x(t,1:k)-theta*norminv(u,0,1))^2)) 中的错误

@(u)fx(u,t,k) 中的错误

积分计算/迭代标量值错误(第 314 行)fx = FUN(t);

积分计算/vadapt 中的错误(第 133 行)[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

积分计算中的错误(第 76 行)[q,errbnd] = vadapt(@AtoBInvTransform,interval);

积分错误(第 89 行) Q = integralCalc(fun,a,b,opstruct);

于 2014-10-23T22:22:32.603 回答