如果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);
[Documentation]
如果integral 曾经将向量u 传递到句柄中,您可能需要一个循环。
但是在查看integral 函数的编写方式时,积分节点作为数组值函数的标量输入,因此除非引发一些奇怪的维度不匹配错误,否则不需要循环。
数组值输出
针对下面的cmets,你可以试试这个函数句柄:
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