2

ランク 1 で共分散行列を更新するプロジェクトで、多項ガウス密度を何度も計算します。共分散をゼロから計算する代わりに、cholupdate関数を使用して新しいサンプルを共分散に追加し、新しいサンプルを共分散から削除しました。このようにして、更新は、共分散行列の $O(n^3)$ コレスキー分解ではなく、$O(n^2)$ で行われるように指示されます。

persistent R
if (initialize) % or isempty(R)
    % compute covariance V
    R = chol(V);
else
    R = cholupdate(R,xAdded);

detVar = prod(diag(R))^2;
Rt = R';
coeff = 1/sqrt((2*pi)^dimension*detVar);
y = Rt\x;
logp = log(coeff) - 1/2 * norm(y)^2;

実際にはコードはかなり複雑ですが、ここでは単純化しました。Rt\xMATLAB で上三角行列の逆行列 (コードの一部) を計算するより高速な方法があるかどうか疑問に思います。MATLAB でより効率的に行うためのアイデアはありますか。

この方法では、行列式の計算も高速になることに注意してください。したがって、新しい方法は、行列式の計算にも悪くありません。

4

1 に答える 1

2

関数mldivideは、三角行列をチェックするのに十分スマートです。その場合、線形システムを効率的に解くために前方/後方置換法を使用します。

AX=B  <-->  X=inv(A)*B  <-->  X=A\B

Lx=b

(x1 を計算し、2 番目の式に代入し、x2 を計算し、3 番目の式に代入 ...)

于 2011-06-19T00:41:18.583 に答える