(Cela devient trop long pour les commentaires ...)
Je suppose que vous devez réellement calculer un inverse dans votre algorithme. 1 Premièrement, il est important de noter que ces algorithmes alternatifs ne sont pas réellement revendiqués comme étant plus rapides , juste qu'ils ont une meilleure complexité asymptotique (ce qui signifie que le nombre requis d'opérations élémentaires croît plus lentement). En fait, dans la pratique, elles sont en réalité (beaucoup) plus lentes que l'approche standard (pour donné ), pour les raisons suivantes:n
La notation cache une constante devant la puissance de , qui peut être astronomiquement grande - si grande que peut être beaucoup plus petite que pour tout qui peut être géré par n'importe quel ordinateur dans un avenir prévisible. (C'est le cas de l'algorithme Coppersmith – Winograd, par exemple.)OnC1n3C2n2. xn
La complexité suppose que chaque opération (arithmétique) prend le même temps - mais cela est loin d'être vrai dans la pratique: multiplier un groupe de nombres avec le même nombre est beaucoup plus rapide que multiplier la même quantité de nombres différents . Cela est dû au fait que le goulot d'étranglement majeur de l'informatique actuelle consiste à mettre les données en cache, et non les opérations arithmétiques réelles sur ces données. Ainsi, un algorithme qui peut être réorganisé pour avoir la première situation (appelé compatible avec le cache ) sera beaucoup plus rapide que celui où cela n'est pas possible. (C'est le cas de l'algorithme Strassen, par exemple.)
De plus, la stabilité numérique est au moins aussi importante que les performances; et là encore, l'approche standard l'emporte généralement.
Pour cette raison, les bibliothèques hautes performances standard (BLAS / LAPACK, que Numpy appelle lorsque vous lui demandez de calculer une inverse) implémentent généralement cette approche. Bien sûr, il existe des implémentations Numpy, par exemple, de l'algorithme de Strassen, mais un algorithme réglé manuellement au niveau de l'assemblage battra fortement un algorithme écrit dans un langage de haut niveau pour toute taille de matrice raisonnable.O ( n3)O ( n2. x)
1 Mais je m'en voudrais de ne pas souligner que cela est très rarement vraiment nécessaire: chaque fois que vous avez besoin de calculer un produit , vous devriez plutôt résoudre le système linéaire (par exemple, en utilisant ) et utilisez place - c'est beaucoup plus stable, et cela peut être fait (en fonction de la structure de la matrice )
beaucoup plus rapidement. Si vous devez utiliser plusieurs fois, vous pouvez précalculer une factorisation de (qui est généralement la partie la plus coûteuse de la résolution) et la réutiliser plus tard.
UNE- 1bA x = bnumpy.linalg.solve
XUNEUNE- 1UNE