如果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