MATLAB matris çarpımı (en iyi hesaplama yaklaşımı)


10

İki referans sistemi (eksen) arasında koordinat dönüşümü yapmam gerekiyor. Bunun için, bazı ara eksenlerin kullanılmasından dolayı üç matrisin ( ) çarpılması gerekir. Bunu çözmek için iki yaklaşım düşündüm:3×3

Yöntem # 1 : doğrudan çarpma yapmak olduğunu

vf=R1 R2 R3 vi

Yöntem # 2 : Adımlara bölün:

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

nerede:

, R' 2 ve R ' 3 olan 3 x 3 matrislerR1R2R33×3

, h ı , v 3 ı , v 23 olan 3 x 1 vektörlervfviv3iv233×1

Dönüşümün gerçekleştirilmesi için hangi yöntemin hesaplama açısından daha verimli (daha az zaman) olduğunu bilmek istiyorum (bu birçok kez yapılacaktır).


4
Kuaterniyonlar kullanın .
Chris Taylor

@ChrisTaylor: Öneriniz için çok teşekkür ederim.
julianfperez

2
Lütfen çapraz postalama.
Off Rip

2
Buraya ve StackOverflow'a çapraz olarak gönderilen iki soru olduğuna dikkat edin. Sorular, yorumları ve cevapları bu soru ile birleştirildi.
Aron Ahmadia

@Will ve AronAhmadia: Üzgünüm. Crossposting'in yasak olduğunu bilmiyordum. Sorularımı hep StackOverflow'da yayınladım ama bugün bu yeni siteyi buldum ve belki de burada yardım bulabileceğimi düşündüm.
julianfperez

Yanıtlar:


17

ABCvA(B(Cv))

A(B(Cv))

Genel olarak küçük programlama farklılıklarının büyük ölçekli hesaplamalar üzerindeki etkisinin nasıl ölçüleceğini öğrenmek için Matlab bilgi istemi '' yardım profiline '' yazın.


Cevabınızda verilen ilginç bilgiler için teşekkür ederiz.
julianfperez

Ara mamulleri kurtarmanız neden daha hızlı?
Federico Poloni

@FedericoPoloni: Bence biraz daha hızlı olduğunu yazmıştı değil ara maddelerin kaydedin.
Arnold Neumaier

@ArnoldNeumaier Ooh özür dilerim. :)
Federico Poloni

14

Yeni başlayanlar için, ara değişkenleri değil, köşeli parantezleri kullanırdım. Tabii ki, ara sonuçlarla ilgilenmiyorsanız, ama sanmıyorum.

Matlab'da aşağıdakileri denedim:

>> 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.

Bununla birlikte, bunun oldukça korkutucu olduğunu söylemeliyim. Her zaman Matlab'ın matris çarpma sırası hakkında akıllı olacağını varsaydım, çünkü bu basit ve etkili bir çözümle ilgili bilinen bir sorundur .


Matrislerin 3x3 olduğu kısmı kaçırdınız mı? :)
Aron Ahmadia

2
@AronAhmadia: Hata! Bunu özledim, teşekkürler. Bu matris boyutları için sanırım, tüm sorun tartışmalı, ancak hala büyük N için sonuçlara şaşırdım
Pedro


2
@Pedro: Cevabınız için teşekkür ederim. Matris boyutu 3x3 için, çözümünüzün normal (parantezsiz) matris çarpımından da daha iyi olduğunu kontrol ettim.
julianfperez

+1, çalışma süresini ölçmenin basit ve kolay bir yolunu gösterdiğiniz için teşekkür ederiz
Steven Magana-Zook

14

Matrisler çok küçük olduğu için, maliyetin tamamı çağrı maliyetinde olacaktır. Dönüşümü birçok kez yapacaksanız, bir kez önceden hesaplamak daha hızlı olacaktır D=A*B*Cve her vektör için geçerlidir v_f=D*v_i. Bunu bir mex dosyasına çıkarmayı da düşünebilirsiniz.


Cevabınız için teşekkür ederim. Benim durumumda, matrisler rotasyonludur (açısal bir değere bağlıdır ve bu değişir), böylece A B C ürünü her zaman aynı değildir.
julianfperez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.