(Ini terlalu panjang untuk dikomentari ...)
Saya akan menganggap Anda benar-benar perlu menghitung invers dalam algoritma Anda. 1 Pertama, penting untuk dicatat bahwa algoritma alternatif ini sebenarnya tidak diklaim lebih cepat , hanya saja mereka memiliki kompleksitas asimptotik yang lebih baik (artinya jumlah operasi elementer yang diperlukan tumbuh lebih lambat). Bahkan, dalam praktiknya ini sebenarnya (jauh) lebih lambat daripada pendekatan standar (untuk diberikan ), karena alasan berikut:n
The -notation kulit konstan di depan kekuatan n , yang dapat astronomis besar - begitu besar sehingga C 1 n 3 bisa jauh lebih kecil dari C 2 n 2. x untuk setiap n yang dapat ditangani oleh komputer manapun di masa mendatang. (Contohnya untuk algoritma Coppersmith – Winograd.)HAInC1n3C2n2. xn
Kompleksitas mengasumsikan bahwa setiap operasi (aritmatika) membutuhkan waktu yang sama - tetapi ini jauh dari benar dalam praktik yang sebenarnya: Mengalikan banyak angka dengan angka yang sama jauh lebih cepat daripada mengalikan jumlah yang sama dari angka yang berbeda . Hal ini disebabkan oleh fakta bahwa leher botol utama dalam komputasi saat ini adalah memasukkan data ke dalam cache, bukan operasi aritmetika aktual pada data tersebut. Jadi suatu algoritma yang dapat diatur ulang untuk memiliki situasi pertama (disebut cache-aware ) akan jauh lebih cepat daripada yang tidak memungkinkan. (Ini kasus untuk algoritma Strassen, misalnya.)
Juga, stabilitas numerik setidaknya sama pentingnya dengan kinerja; dan di sini, sekali lagi, pendekatan standar biasanya menang.
O ( n3)O ( n2. x)
1 Tapi saya akan salah jika saya tidak menunjukkan bahwa ini sangat jarang benar-benar diperlukan: kapan saja Anda perlu menghitung produk
, Anda harus menyelesaikan sistem linier
A x = b (misalnya, menggunakan ) dan gunakan
x sebagai gantinya - ini jauh lebih stabil, dan dapat dilakukan (tergantung pada struktur matriks
A )
jauh lebih cepat. Jika Anda perlu menggunakan
A - 1 beberapa kali, Anda dapat melakukan precompute faktorisasi
A (yang biasanya merupakan bagian paling mahal dari penyelesaian) dan menggunakannya kembali nanti.
SEBUAH- 1bA x = bnumpy.linalg.solve
xSEBUAHSEBUAH- 1SEBUAH