2013-08-09 5 views
2

Je fais de l'algèbre linéaire avec de très grandes matrices symétriques (~ 800mb), et j'essaie plusieurs décompositions différentes. Actuellement, j'implémente LDLT et j'aimerais en profiter pour réduire de moitié mes besoins en mémoire en écrasant le triangle supérieur de ma matrice avec L^T. Bien que la documentation d'Eigen ne mentionne pas de toute façon cela, il y a des méthodes cachées dans l'espace de noms interne qui peuvent faire ce que je veux.Inplace LDLT décomposition avec Eigen

Les méthodes se trouvent dans ces struct: template<> struct ldlt_inplace<Lower> et template<> struct ldlt_inplace<Upper> dans http://eigen.tuxfamily.org/dox/LDLT_8h_source.html

Ai-je raison que ces méthodes sont ce que je veux? Comment les utiliser? Devrais-je éviter de les utiliser parce qu'ils sont internes, et donc sujets à changement et dépréciation?

Répondre

1

En interne signifie en effet que le prototype de cette fonction pourrait changer dans les versions futures. la THDV :: méthode de calcul() est un bon exemple sur la façon de l'utiliser:

Transpositions<Dynamic> T(mat.cols()); 
VectorXd temp(mat.cols()); 
int sign; 
Eigen::internal::ldlt_inplace<Eigen::Lower>::unblocked(mat, T, temp, &sign); 

EDIT

En Eigen 3.3, vous pouvez utiliser LDLT<Ref<MatrixXd> >:

MatrixXd A; 
LDLT<Ref<MatrixXd> > ldlt(A); 

ldlt sera puis factoriser A dans A lui-même. Voir le doc pour plus de détails.

+0

Merci! C'est assez simple en fait. Y a-t-il des précautions que je peux prendre pour me protéger des changements futurs? – nitrous

+1

Il est maintenant officiellement supporté: http://eigen.tuxfamily.org/dox-devel/group__InplaceDecomposition.html – ggael