Sans quelques informations sur la construction de ces matrices symétriques réelles définies positives , les suggestions à faire sont nécessairement assez limitées.12×12
J'ai téléchargé le paquet Armadillo de Sourceforge et j'ai jeté un œil à la documentation. Essayez d'améliorer les performances du calcul séparé de et , où est la matrice de rang 1 de toutes les unités, en définissant par exemple . La documentation note que c'est la valeur par défaut pour les matrices jusqu'à la taille , donc par omission je suppose que l' option est une valeur par défaut pour le cas .det(Q)J 4 × 4 12 × 12det(12I−Q−J)Jdet(Q,slow=false)
4×4slow=true
12×12
Ce qui est slow=true
vraisemblablement fait est un pivot partiel ou total pour obtenir une forme d'échelon de ligne, à partir de laquelle le déterminant est facilement trouvé. Cependant, vous savez à l'avance que la matrice est définie positive, donc le pivotement n'est pas nécessaire pour la stabilité (au moins présumément pour la majeure partie de vos calculs. Il n'est pas clair si le paquet Armadillo lève une exception si les pivots deviennent trop petits, mais cela devrait être un fonctionnalité d'un package d'algèbre linéaire numérique raisonnable. EDIT: J'ai trouvé le code Armadillo qui implémente dans le fichier d'en-tête , en utilisant des modèles C ++ pour des fonctionnalités substantielles. Le paramètre ne semble pas affecter la façon dont un12 × 12Qdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12le déterminant sera fait parce que le calcul est "jeté sur un mur" vers LAPACK (ou ATLAS) à ce point sans indication que le pivotement n'est pas requis; voir det_lapack
et ses invocations dans ce fichier.
L'autre point serait de suivre leur recommandation de construire le paquet Armadillo lié aux remplacements à haute vitesse pour BLAS et LAPACK, si vous les utilisez effectivement; voir Sec. 5 du fichier README.TXT d'Armadillo pour plus de détails. [L'utilisation d'une version 64 bits dédiée de BLAS ou LAPACK est également recommandée pour la vitesse sur les machines 64 bits actuelles.]
La réduction des lignes en échelon est essentiellement une élimination gaussienne et a une complexité arithmétique . Pour les deux matrices, cela équivaut alors au double de ce travail, ou . Ces opérations peuvent bien être le "goulot d'étranglement" dans votre traitement, mais il y a peu d'espoir que sans structure spéciale dans (ou certaines relations connues parmi les milliards de cas de test permettant l'amortissement), le travail pourrait être réduit à .423n3+O(n2)QO(n2)43n3+O(n2)QO(n2)
A titre de comparaison, l'expansion par les cofacteurs d'une matrice générale impliqueles opérations de multiplication (et à peu près autant d'additions / soustractions), donc pour la comparaison ( vs ) favorise clairement l'élimination par rapport aux cofacteurs.n ! n = 12 12 ! = 479001600 2n×nn!n=1212!=47900160023n3=1152
Une autre approche nécessitant un travail consisterait à réduire en forme tridiagonale avec des transformations de Householder, ce qui met également en forme tridiagonale. Les calculs et peuvent ensuite être effectués dans des opérations . [L'effet de la mise à jour de rang un dans le deuxième déterminant peut être exprimé comme un facteur scalaire donné en résolvant un système tridiagonal.]Q12I-Qdet(Q)det(12I-Q-J)O(n)-J43n3+O(n2)Q12I−Qdet(Q)det(12I−Q−J)O(n)−J
La mise en œuvre d'un tel calcul indépendant pourrait être utile pour vérifier les résultats des appels réussis (ou échoués) à la det
fonction d'Armadillo .
Cas spécial: comme suggéré par un commentaire de Jernej, supposons que où comme avant est la matrice (rang 1) de tous les uns et est un matrice diagonale non singulière (positive). En effet, pour l'application proposée en théorie des graphes, il s'agirait de matrices entières. Alors une formule explicite pour est:J D = diag ( d 1 , … , d n ) det ( Q )Q=D−JJD=diag(d1,…,dn)det(Q)
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
Une esquisse de sa preuve donne l'occasion d'illustrer une applicabilité plus large, c'est-à-dire chaque fois que a un déterminant connu et que le système est rapidement résolu. Commencez par prendre en compte:D v = ( 1 … 1 ) TDDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
Maintenant est à nouveau rang 1, à savoir . Notez que le deuxième déterminant est simplement:( d - 1 1 … d - 1 n ) T ( 1 … 1 )D−1J(d−11…d−1n)T(1…1)
f(1)=det(I−D−1J)
où est le polynôme caractéristique de . En tant que matrice de rang 1, doit avoir (au moins) facteurs de pour tenir compte de son espace nul. La valeur propre "manquante" est , comme le montre le calcul:D - 1 J f ( x ) n - 1 x ∑ d - 1 if(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Il s'ensuit que le polynôme caractéristique , et est comme indiqué ci-dessus pour , .f ( 1 ) det ( I - D - 1 J ) 1 - ∑ d - 1 if(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
Notez également que si , alors , une matrice diagonale dont le déterminant est simplement le produit de ses entrées diagonales.12 I - Q - J = 12 I - D + J - J = 12 I - DQ=D−J12I−Q−J=12I−D+J−J=12I−D