(Esto se está haciendo demasiado largo para comentarios ...)
Asumiré que realmente necesitas calcular un inverso en tu algoritmo. 1 Primero, es importante tener en cuenta que estos algoritmos alternativos en realidad no se afirman que sean más rápidos , solo que tienen una mejor complejidad asintótica (lo que significa que el número requerido de operaciones elementales crece más lentamente). De hecho, en la práctica, estos son en realidad (mucho) más lentos que el enfoque estándar (para un dado ), por las siguientes razones:n
La notación oculta una constante frente a la potencia de , que puede ser astronómicamente grande, tan grande que puede ser mucho más pequeña que para cualquier que puede ser manejado por cualquier computadora en el futuro previsible. (Este es el caso del algoritmo Coppersmith – Winograd, por ejemplo).OnC1n3C2n2.xn
La complejidad supone que cada operación (aritmética) lleva el mismo tiempo, pero esto está lejos de ser cierto en la práctica real: multiplicar un grupo de números con el mismo número es mucho más rápido que multiplicar la misma cantidad de números diferentes . Esto se debe al hecho de que el cuello de botella principal en la informática actual es llevar los datos a la memoria caché, no las operaciones aritméticas reales sobre esos datos. Por lo tanto, un algoritmo que se puede reorganizar para tener la primera situación (llamado reconocimiento de caché ) será mucho más rápido que uno donde esto no sea posible. (Este es el caso del algoritmo de Strassen, por ejemplo).
Además, la estabilidad numérica es al menos tan importante como el rendimiento; y aquí, nuevamente, el enfoque estándar generalmente gana.
Por esta razón, las bibliotecas estándar de alto rendimiento (BLAS / LAPACK, que Numpy llama cuando le pide que calcule un inverso) generalmente solo implementan este enfoque. Por supuesto, hay implementaciones de Numpy de, por ejemplo, el algoritmo de Strassen, pero un algoritmo ajustado a mano en el nivel de ensamblaje superará a un algoritmo escrito en un lenguaje de alto nivel para cualquier tamaño de matriz razonable.O(n3)O(n2.x)
1 Pero me equivocaría si no señalara que esto rara vez es realmente necesario: cada vez que necesite calcular un producto , debería resolver el sistema lineal (p. Ej., usando ) y use lugar: esto es mucho más estable y se puede hacer (dependiendo de la estructura de la matriz )
mucho más rápido. Si necesita usar varias veces, puede calcular previamente una factorización de (que generalmente es la parte más costosa de la solución) y reutilizarla más tarde.
A−1bAx=bnumpy.linalg.solve
xAA−1A