(Bu yorumlar için çok uzun sürüyor ...)
Aslında algoritmanızda tersini hesaplamanız gerektiğini varsayacağım. 1 İlk olarak, bu alternatif algoritmaların aslında daha hızlı olduğu iddia edilmediğini , sadece daha iyi asimptotik karmaşıklığa sahip olduklarını belirtmek önemlidir (yani, gerekli sayıda temel işlem daha yavaş büyür). Aslında, pratikte bunlar , aşağıdaki nedenlerden dolayı (verilen için ) aslında standart yaklaşımdan ( çok) daha yavaştır :n
-notation deri gücü önünde sürekli bir astronomik büyük olabilir, - çok büyük olduğunu den çok daha küçük olabilir herhangi olduğu öngörülebilir gelecekte herhangi bir bilgisayar tarafından ele alınabilir. (Bu, örneğin Coppersmith – Winograd algoritması için geçerlidir.)ÖnC1n3C2n2. xn
Karmaşıklık, her (aritmetik) işlemin aynı zamanı aldığını varsayar - ancak bu gerçek uygulamada gerçek olmaktan çok uzaktır: Aynı sayı ile bir grup sayıyı çarpmak, aynı sayıda farklı sayıyı çarpmaktan çok daha hızlıdır . Bunun nedeni, mevcut hesaplamadaki büyük şişe boynunun, verileri o verilerdeki gerçek aritmetik işlemleri değil, önbelleğe almasıdır. Dolayısıyla, ilk duruma ( önbellek uyumlu olarak adlandırılır ) sahip olacak şekilde yeniden düzenlenebilen bir algoritma , bunun mümkün olmadığı bir yerden çok daha hızlı olacaktır. (Örneğin Strassen algoritması için durum budur.)
Ayrıca, sayısal kararlılık en az performans kadar önemlidir; ve burada, yine, standart yaklaşım genellikle kazanır.
Bu nedenle, standart yüksek performanslı kütüphaneler (Numpy'nin tersi hesaplamasını istediğinde çağırdığı BLAS / LAPACK) genellikle sadece bu yaklaşımı uygular. Elbette, örneğin Strassen'in algoritmasının orada Numpy uygulamaları vardır, ancak montaj seviyesinde elle ayarlanan bir algoritması bir herhangi bir makul matris boyutu için üst düzey bir dilde yazılmış algoritma.O ( n3)O ( n2. x)
1 Ama bunun çok nadiren gerçekten gerekli olduğuna işaret etmediysem yanlış olurum: ürününü hesaplamanız gerektiğinde, bunun yerine doğrusal sistemini çözmelisiniz (örn. kullanarak ) kullanın ve kullanın - bu çok daha kararlıdır ve ( matrisinin yapısına bağlı olarak )
çok daha hızlı yapılabilir. Kullanmak gerekiyorsa birden çok kez, sen faktorize precompute edebilirsiniz daha sonra ve yeniden (genellikle en pahalı çözmek parçasıdır).
bir- 1bA x = bnumpy.linalg.solve
xbirbir- 1bir