Kita semua akrab dengan banyak metode komputasi untuk menyelesaikan sistem linear standar
Namun, saya ingin tahu apakah ada metode komputasi "standar" untuk memecahkan sistem linier yang lebih umum (dimensi terbatas) dari formulir tersebut.
A m 1 × n 1 B m 2 × n 2 L m 1 × n 1 m 2 × n 2 A x = b
mana, katakanlah, adalah matriks , adalah matriks , dan adalah operator linier yang mengambil matriks ke matriks , yang tidak melibatkan vektorisasi matriks , yaitu mengkonversi semuanya ke bentuk standar .
Alasan saya bertanya adalah saya harus menyelesaikan persamaan berikut untuk :
R R ∗ u f
mana adalah transformasi Radon 2d, adjoinnya, dan dan adalah array 2d (gambar). Dimungkinkan untuk memvariasikan persamaan ini, tetapi ini menyebalkan, terutama jika kita beralih ke 3D.
Lebih umum, bagaimana dengan array ? Misalnya, menyelesaikan mana dan adalah array 3D (saya harus melakukan ini dengan Radon transform di beberapa titik juga).
Terima kasih sebelumnya, dan jangan ragu untuk mengirim saya ke StackExchange lain jika Anda merasa perlu.
linear-algebra
icurays1
sumber
sumber
Jawaban:
Ya, Anda sudah benar, dan itu memang akan berfungsi dengan baik ketika Anda meningkatkan ke 3-D. Bagian yang paling mudah, sebenarnya, adalah produk dalam --- lakukan saja produk titik standar pada vektor yang setara, ekuivalen . Karena Anda mungkin menyimpan data secara bersamaan, Anda dapat melakukannya di tempat. Ini bahkan bekerja dengan ruang vektor yang kompleks --- perlakukan saja nilai-nilai kompleks sebagai pasangan nilai nyata. Itu karena untuk CG Anda memerlukan produk dalam nyata .Rn ⟨y,x⟩≜Re(yHx)
Satu hal yang Anda harus berhati-hati ketika Anda menerapkan CG (atau pendekatan berulang serupa) dengan operator linier umum adalah menerapkan adjoint operator linier Anda dengan benar. Artinya, orang sering mendapatkan benar, tetapi melakukan kesalahan dengan mengimplementasikan .y=F(x) z=F∗(y)
Saya sarankan menerapkan tes sederhana yang memanfaatkan identitas berikut: untuk setiap dan sesuai , Jadi yang Anda lakukan adalah menghasilkan nilai acak dan , menjalankannya masing-masing melalui operasi forward dan adjoint Anda, dan menghitung dua produk dalam di atas. Pastikan mereka cocok dengan presisi yang masuk akal, dan ulangi beberapa kali.x y
EDIT: apa yang Anda lakukan jika operator linier Anda seharusnya simetris? Nah, Anda juga perlu memverifikasi simetri itu. Jadi gunakan tes yang sama, hanya mencatat bahwa --- terapkan operasi yang sama untuk dan . Tentu saja, OP memiliki operator asimetris dan simetris untuk menangani ...F=F∗ x y
sumber
linop_test.m
rutin untuk alasan ini. Paket itu juga mendukung matriks, array, dan produk Cartesian dalam ruang vektor.Ternyata, karena sistem saya simetris dan pasti positif (karena operator linier saya ditulis sebagai ), gradien konjugat dapat diadaptasi untuk menyelesaikan jenis persamaan ini secara berulang. Satu-satunya modifikasi muncul ketika menghitung produk dalam - yaitu perhitungan khas produk dalam di CG terlihat seperti atau . Dalam versi modifikasi, kami menggunakan produk dalam Frobenius, yang dapat dihitung dengan menjumlahkan entri dari produk Hadamard (searah). YaituR∗R+λI rTkrk pTkApk
Saya menduga ini akan baik-baik saja ketika saya memutakhirkan ke array 3D, meskipun saya belum melihat produk dalam Frobenius didefinisikan pada array 3D (saya akan bekerja di bawah asumsi bahwa saya dapat lagi hanya menjumlahkan produk pointwise).
Saya masih tertarik dengan metode yang lebih umum jika ada yang tahu!
sumber