Je calcule la densité multinomial Gaussian pour un grand nombre de fois dans un projet où je mets à jour la matrice de covariance par rang-1. Au lieu de calculer la covariance à partir de zéro, j'ai utilisé la fonction cholupdate
pour ajouter un nouvel échantillon à la covariance et supprimer un nouvel échantillon à la covariance. De cette façon, on dit que la mise à jour est dans $ O (n^2) $ par opposition à la factorisation $ O (n^3) $ Cholesky de la matrice de covariance.Matrice diagonale supérieure rapide et efficace inverse
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;
En fait le code est assez compliqué mais je l'ai simplifié ici. Je me demande s'il existe un moyen plus rapide de calculer l'inverse (la partie Rt\x
dans le code) d'une matrice triangulaire supérieure dans MATLAB. Avez-vous des idées pour le faire plus efficacement dans MATLAB. Notez que le calcul du déterminant est également plus rapide de cette façon. Donc la nouvelle méthode ne sera pas non plus mauvaise pour le calcul du déterminant.
S'il existe un langage fiable pour effectuer des manipulations matricielles efficaces, c'est Matlab. – Jonas