Comment trouver le déterminant de la matrice de grande taille
J'ai trouvé un code C++ pour trouver le déterminant de la matrice, pour les 4x4 et 8x8. Cela fonctionne bien, mais mon projet a besoin de matrices qui sont 18x18 ou plus, et le code est trop lent. Le code est récursive, mais la récursivité est un concept idéal pour faire face à une 18x18 de la matrice? Sinon, comment puis-je trouver le déterminant?
OriginalL'auteur vernomcrp | 2009-12-11
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous êtes à l'aide de la méthode naïve de l'expansion de La formule de Laplace. Si vous voulez gagner de la vitesse, vous pouvez décomposer votre matrice
M
à l'aide de La décomposition LU (en deux inférieur et supérieur de la diagonale des matrices) qui vous permet d'atteindre une modification de Gauss-Jordan d'élimination dans2*n^3/3 FLOPS
et puis de calculer le déterminant:det(M) = det(L) * det(U)
, qui, pour des matrices triangulaires est simplement le produit des entrées dans leur diagonale.Ce processus sera encore plus rapide que
O(n!)
.Edit: vous pouvez également utiliser La méthode de Crout, ce qui est largement mis en œuvre.
C'est vrai, mais je ne suis pas sûr de savoir comment vérifier qu'une matrice est définie positive, alors j'ai sauté cette.
Le calcul du déterminant d'une matrice triangulaire est simple: multiplier les éléments de la diagonale, comme les cofacteurs des termes diagonaux sont 0. À l'aide d'une décomposition LU simplifie encore ceci, que L est une unité, triangulaire inférieure de la matrice, c'est à dire ses éléments diagonaux sont tous 1, dans la plupart des implémentations. À cet effet, souvent, vous n'avez qu'à calculer le déterminant de l'U.
vous êtes à la demi-droite - L (U) ne peut pas toujours être l'unité matrice triangulaire, et même si cela peut être ce n'est pas vraiment intuitive de la trouver, si vous ne le faites pas pour les devoirs. 😉
FWIW, je l'ai trouvé Doolittle algorithme plus facile à mettre en œuvre et à comprendre que les Crout. J'ai aussi été en mesure de le modifier légèrement pour support le multithreading.
OriginalL'auteur Michael Foukarakis
Bien, pas beaucoup d'entre nous qui travaillent dans le domaine considèrent 18x18 comme une matrice de grande taille et presque toute la technique que vous choisissez, il doit être assez rapide sur n'importe quel ordinateur moderne. Ni beaucoup d'entre nous aborder les questions de matrice avec des algorithmes récursifs, beaucoup plus enclins à utiliser itératif, mais qui pourrait être un reflet du fait que beaucoup de personnes qui travaillent sur la matrice des problèmes sont des scientifiques et des ingénieurs informaticiens.
Je vous suggère de regarder les Recettes ou Numérique en C++. Pas forcément le meilleur code que vous trouverez, mais c'est un texte pour l'étude et l'apprentissage. Pour mieux les codes, BOOST a une bonne réputation et il y a toujours BLAS et des choses comme l'Intel Math Kernel Library ou AMD de Base en Mathématiques de la Bibliothèque. Je pense que toutes ces implémentations de déterminant-trouver des routines qui va s'attaquer à un 18x18 matrice très rapidement.
OriginalL'auteur High Performance Mark
Puisque je ne peux pas commenter, je tiens à ajouter ceci: la décomposition de Cholesky (ou sa variante, le LDLT, L'un inférieur de l'unité matrice triangulaire et D une matrice diagonale) peut être utilisé pour vérifier si une matrice symétrique est positif/négatif définitive: si elle est définie positive, les éléments de D sont tous positifs, et la décomposition de Cholesky va se terminer avec succès sans prendre la racine carrée d'un nombre négatif. Si la matrice a est négatif définitive, les éléments de D sont tous négatifs, la matrice elle-même n'aura pas de décomposition de Cholesky, mais les effets négatifs de il serait.
"Le calcul du déterminant d'une matrice triangulaire est simple: multiplier les éléments de la diagonale, comme les cofacteurs des termes diagonaux sont 0. À l'aide d'une décomposition LU simplifie encore ceci, que L est une unité, triangulaire inférieure de la matrice, c'est à dire ses éléments diagonaux sont tous 1, dans la plupart des implémentations. À cet effet, souvent, vous n'avez qu'à calculer le déterminant de la U."
Que pour le code, NR n'est pas libre; je suggère de prendre un coup d'oeil à LAPACK/CLAPACK/LAPACK++ @ http://www.netlib.org/ à la place. Pour référence, je ne peux pas faire mieux que de vous diriger à "Matrice de Calculs" par Golub et Van Loan.
OriginalL'auteur
La fonction det_recursive travaille pour une matrice carrée de taille quelconque. Toutefois, depuis qu'elle est récursive à l'aide de méthode naïve de l'expansion de la formule de Laplace, il est très lent pour des matrices de grande taille.
Une autre technique consiste à transformer la matrice dans un haut de forme triangulaire à l'aide de l'élimination de gauss technique. Alors le déterminant de la matrice est simplement les produits des éléments de la diagonale de la forme triangulaire de transformer la forme de la matrice d'origine.
Fondamentalement numpy est le plus rapide mais en interne, il utilise une sorte de linéaire de la matrice de transformation méthode similaire à ce que l'élimination de gauss. Cependant, je ne suis pas sûr de ce qu'il est!
OriginalL'auteur Khalil Al Hooti