2009-07-20 10 views

Répondre

2

Une façon de calculer le déterminant utilise la décomposition LU:

LaVectorLongInt pivots(A.cols()); 

    LUFactorizeIP(A, pivots); 

    double detA = 1; 
    for (int i = 0; i < A.cols(); ++i) 
    detA *= A(i, i); 

Attention, A va changer, afin de faire une copie est probablement conseillé.

+0

J'ai accepté cette réponse maintenant comme la réponse acceptée, car aucune autre option n'a été fournie. Si quelqu'un ajoute une autre solution (bonne, acceptable), j'accepterai cette réponse. –

+0

Je pense que vous avez également besoin d'un signe négatif si vous avez un nombre impair de permutations (la taille des pivots est impair). Voir aussi: http://icl.cs.utk.edu/lapack-forum/viewtopic.php?p=341&#p336 –

+0

La factorisation est 'A = PLU'. Ici L a les uns sur la diagonale, donc 'det (L) = 1'. Maintenant 'det (A) = det (P) * det (L) * det (U) = det (P) * 1 * det (U)'. Dans le code ci-dessus, le signe de la matrice de perméance 'P' (représenté par un tableau de pivots) n'est pas géré. – soegaard

0

Je ne sais pas à propos de lapack ++ mais je suis sûr qu'il n'y a pas de lapack standard, check. Autant que je sache, lapack ++ n'implémente pas l'opération matricielle elle-même mais utilise les autres, en fait vous pouvez basculer entre plusieurs d'entre eux (atlas, mkl (intel math kernel library) et ainsi de suite). Par conséquent, mon hypothèse est qu'il existe une opération déterminante dans lapack ++.

+0

Lapack ++ contient toutes les opérations BLAS. Il n'y a pas de fonction déterminante dans BLAS, mais il y a probablement d'autres méthodes qui peuvent être utilisées pour obtenir le déterminant. –

+0

Désolé, j'ai mal compris votre question. Je méritais le mauvais karma :-). –