Dalam proyek saya, saya harus menyelesaikan beberapa matriks tridiagonal pada setiap langkah waktu, jadi sangat penting untuk memiliki pemecah yang baik untuk mereka. Saya melakukan implementasi saya sendiri, hanya cara klasik untuk melakukannya dijelaskan di Wikipedia. Saya kemudian mencoba menggunakan Lapack sebagai gantinya, dan yang mengejutkan saya lebih lambat!
Sekarang, di dalam Lapack sepertinya itu adalah penyelesaian dengan faktorisasi LU dan saya bertanya-tanya mengapa, bukankah ini lebih kompleks daripada yang seharusnya?
Selain itu, saya menemukan sebuah algoritma dalam buku "Numerical Recipes" dari nr.com yang secara rekursif membagi sistem menjadi masalah tridiagonal yang lebih kecil. Itu tampak menjanjikan. Apakah ada barang lain di luar sana?
Pembaruan: ukuran masalahnya sekitar 1000x1000. Saya menggunakan GotoBLAS, itu memberi Anda perpustakaan Lapack 3.1.1 juga. Masalahnya bukan simetris. Saya menggunakan rutin Lapack untuk matriks tridiagonal umum.
sumber
Jawaban:
Anda menggunakan implementasi referensi yang melakukan pivot parsial. Pemecahan Tridiagonal sangat sedikit bekerja dan tidak memanggil BLAS. Kemungkinan lebih lambat daripada kode Anda karena pivoting parsial. The kode sumber untuk dgtsv sangatlah mudah.
Jika Anda akan menyelesaikan dengan matriks yang sama beberapa kali, Anda mungkin ingin menyimpan faktor-faktor dengan menggunakan dgttrf dan dgttrs . Ada kemungkinan bahwa implementasi dalam LAPACK yang dioptimalkan seperti MKL, ACML, atau ESSL akan lebih berkinerja.
sumber