J'ai une (n x n) matrice symétrique A et un (n x 1) vecteur B. Fondamentalement, j'ai juste besoin de résoudre Ax = b pour x. Le problème est que A va potentiellement être énorme. Je recherche donc l'algorithme le plus efficace pour résoudre des équations linéaires en C++. J'ai regardé la bibliothèque Eigen. Apparemment, il a une méthode SVD, mais on m'a dit que c'était lent. La résolution de x = inverse (A) * b semble également être sous-optimale. UBLAS est-il plus rapide? Existe-t-il des méthodes plus efficaces? Merci.
Edit: la matrice A est définie positive et non clairsemée.
La meilleure façon de résoudre un système d'équations linéaires de la forme Ax = b
consiste à effectuer les opérations suivantes.
A
au format A = M1 * M2
(où M1
et M2
sont triangulaires)M1 * y = b
pour y
en utilisant la substitution arrièreM2 * x = y
pour x
en utilisant la substitution arrièrePour les matrices carrées , l'étape 1 utiliserait LU Decomposition .
Pour les matrices non carrées , l'étape 1 utiliserait QR Decomposition .
Si la matrice A est définie positive et non clairsemée , vous utiliseriez Décomposition Cholesky pour la première étape.
Si vous voulez utiliser eigen, vous devrez d'abord le décomposer puis résoudre triangulaire le.
Si cela est encore lent, heureusement, il existe de nombreuses bibliothèques d'algèbre linéaire qui peuvent aider à améliorer les performances. La routine que vous devriez rechercher est dpotrs
. Certaines bibliothèques qui l'ont implémenté sont les suivantes:
Si vous utilisez eigen dans le projet global, vous pouvez interfacer la routine LAPACK dont vous avez besoin comme décrit ici .