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