2011-06-18 13 views
2

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.

Répondre

2

La fonction mldivide est smart enough pour vérifier les matrices triangulaires, et dans ce cas il utilise une méthode forward/backward substitution pour résoudre efficacement le système linéaire:

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

Lx=b

(compute x1, substituer au second équation et calcul x2, substituer en troisième ...)

+3

S'il existe un langage fiable pour effectuer des manipulations matricielles efficaces, c'est Matlab. – Jonas

Questions connexes