Multiplikasi matriks MATLAB (pendekatan komputasi terbaik)


10

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:3×3

Metode # 1 : Membuat perkalian secara langsung, yaitu,

vf=R1 R2 R3 vi

Metode # 2 : Pisahkan menjadi beberapa langkah:

  1. v3i=R3 vi
  2. v23=R2 v3i
  3. vf=R1 v23

dimana:

R 2 R 3 3 × 3R1 , dan adalah matriksR2R33×3

v i v 3 i v 23 3 × 1vf , , , adalah vektorviv3iv233×1

Saya ingin tahu metode apa yang lebih efisien secara komputasi (lebih sedikit waktu) untuk melakukan transformasi (ini akan dibuat berkali-kali).


4
Gunakan angka empat .
Chris Taylor

@ChrisTaylor: Terima kasih banyak atas saran Anda.
julianfperez

2
Tolong jangan lintas pos.
Ripped Off

2
Catatan, ada dua pertanyaan lintas-posting di sini dan StackOverflow. Pertanyaan dan komentar serta jawaban mereka telah digabungkan menjadi yang ini.
Aron Ahmadia

@ Will dan AronAhmadia: Saya minta maaf. Saya tidak tahu crossposting dilarang. Saya selalu memposting pertanyaan saya di StackOverflow tetapi hari ini saya menemukan situs baru ini dan saya pikir mungkin saya dapat menemukan bantuan di sini juga.
julianfperez

Jawaban:


17

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 ) )ABCvA(B(Cv))

Di sisi lain, harus sedikit lebih cepat daripada jika Anda menyimpan perantara dalam vektor yang terpisah, seperti yang disarankan metode kedua Anda.A(B(Cv))

Untuk mengetahui secara umum bagaimana mengukur dampak perbedaan pemrograman kecil pada perhitungan skala besar, tulis di Matlab prompt '' profil bantuan ''.


Terima kasih atas informasi menarik yang diberikan dalam jawaban Anda.
julianfperez

Mengapa lebih cepat jika Anda menyimpan perantara?
Federico Poloni

@FedericoPoloni: Saya telah menulis bahwa sedikit lebih cepat untuk tidak menyelamatkan perantara.
Arnold Neumaier

@ArnoldNeumaier Ooh maaf saya salah membaca. :)
Federico Poloni

14

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:

>> N = 500;                                             
>> A = rand(N); B = rand(N); C = rand(N); v = rand(N,1);

>> tic, for k=1:100, A*B*C*v; end; toc
Elapsed time is 3.207299 seconds.

>> tic, for k=1:100, A*(B*(C*v)); end; toc
Elapsed time is 0.108095 seconds.

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.


Apakah Anda melewatkan bagian di mana matriksnya 3x3? :)
Aron Ahmadia

2
@AronAhmadia: Ups ... Rindu itu, terima kasih. Saya kira untuk ukuran matriks itu, seluruh masalahnya bisa diperdebatkan, tapi saya masih terkejut dengan hasilnya untuk N. besar
Pedro

7
Saya menduga MATLAB mengikuti aturan C didahulukan untuk evaluasi ekspresi karena matematika floating point tidak asosiatif dan mereka harus menganggap Anda tahu apa yang Anda lakukan :)
Aron Ahmadia

2
@Pedro: Terima kasih atas jawaban Anda. Untuk dimensi matriks 3x3 saya telah memeriksa bahwa solusi Anda juga lebih baik daripada perkalian matriks yang biasa (tanpa tanda kurung).
julianfperez

+1 terima kasih telah menunjukkan cara sederhana dan mudah untuk mengukur waktu berlari
Steven Magana-Zook

14

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*Csekali dan kemudian untuk setiap vektor berlaku v_f=D*v_i. Anda juga dapat mempertimbangkan membawa ini ke file mex.


Terima kasih atas jawaban Anda. Dalam kasus saya, matriks adalah yang rotasi (mereka bergantung pada nilai sudut dan perubahan ini) sehingga produk A B C tidak selalu sama.
julianfperez
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.