Saya harus membuat transformasi koordinat antara dua sistem referensi (sumbu). Untuk itu, tiga matriks ( ) harus dikalikan karena beberapa sumbu perantara yang digunakan. Saya telah memikirkan dua pendekatan untuk menyelesaikan ini:
Metode # 1 : Membuat perkalian secara langsung, yaitu,
Metode # 2 : Pisahkan menjadi beberapa langkah:
dimana:
R 2 R 3 3 × 3 , dan adalah matriks
v i v 3 i v 23 3 × 1 , , , adalah vektor
Saya ingin tahu metode apa yang lebih efisien secara komputasi (lebih sedikit waktu) untuk melakukan transformasi (ini akan dibuat berkali-kali).
matrix
performance
matlab
julianfperez
sumber
sumber
Jawaban:
Matlab menafsirkan urutan perkalian dan / atau pembagian dari kiri ke kanan. Karenanya jauh lebih mahal daripada , karena Anda memiliki dua produk matriks dan satu produk matriks-vecor menggantikan tiga produk vektor-matriks.A ∗ ( B ∗ ( C ∗ v ) )A∗B∗C∗v A∗(B∗(C∗v))
Di sisi lain, harus sedikit lebih cepat daripada jika Anda menyimpan perantara dalam vektor yang terpisah, seperti yang disarankan metode kedua Anda.A∗(B∗(C∗v))
Untuk mengetahui secara umum bagaimana mengukur dampak perbedaan pemrograman kecil pada perhitungan skala besar, tulis di Matlab prompt '' profil bantuan ''.
sumber
Sebagai permulaan, saya tidak akan menggunakan variabel perantara, tetapi kurung. Kecuali, tentu saja, Anda tertarik pada hasil antara, tapi saya rasa tidak.
Saya mencoba yang berikut di Matlab:
Saya harus mengatakan, bahwa ini sangat menakutkan. Saya selalu berasumsi bahwa Matlab akan pintar tentang urutan perkalian matriks, karena ini adalah masalah yang dikenal dengan solusi yang sederhana dan efisien.
sumber
Karena matriksnya sangat kecil, semua biaya akan dikenakan biaya overhead. Jika Anda akan melakukan transformasi berkali-kali, akan lebih cepat untuk melakukan precompute
D=A*B*C
sekali dan kemudian untuk setiap vektor berlakuv_f=D*v_i
. Anda juga dapat mempertimbangkan membawa ini ke file mex.sumber