Multiplication matricielle MATLAB (la meilleure approche informatique)

10

Je dois faire une transformation de coordonnées entre deux référentiels (axes). Pour cela, trois matrices ( ) doivent être multipliées en raison de l'utilisation de certains axes intermédiaires. J'ai pensé à deux approches pour résoudre ce problème:3×3

Méthode n ° 1 : effectuer la multiplication directement, c'est-à-dire

vf=R1 R2 R3 vi

Méthode n ° 2 : diviser en étapes:

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

où:

R1 , et sont des matricesR2R33×3

vf , , , sont vecteursviv3iv233×1

Je voudrais savoir quelle méthode est la plus efficace sur le plan du calcul (moins de temps) pour effectuer la transformation (cela sera fait beaucoup de fois).

julianfperez
la source
4
Utilisez des quaternions .
Chris Taylor
@ChrisTaylor: Merci beaucoup pour votre suggestion.
julianfperez
2
S'il vous plaît ne pas crosspost.
Déchiré
2
Remarque, il y avait deux questions croisées ici et StackOverflow. Les questions et leurs commentaires et réponses ont été fusionnés dans celui-ci.
Aron Ahmadia
@Will et AronAhmadia: je suis désolé. Je ne savais pas que le crossposting est interdit. J'ai toujours posté mes questions sur StackOverflow mais aujourd'hui j'ai trouvé ce nouveau site et j'ai pensé que je pourrais peut-être trouver de l'aide ici aussi.
julianfperez

Réponses:

17

Matlab interprète des séquences de multiplications et / ou de divisions de gauche à droite. Par conséquent, est beaucoup plus cher que , car vous avez deux produits matriciels et un produit matrice-vecor à la place de trois produits matrice-vecteur.ABCvA(B(Cv))

En revanche, devrait être légèrement plus rapide que si vous enregistrez les intermédiaires dans des vecteurs séparés, comme le suggère votre deuxième méthode.A(B(Cv))

Pour savoir en général comment mesurer l'impact des petites différences de programmation sur les calculs à grande échelle, écrivez à l'invite Matlab '' profil d'aide ''.

Arnold Neumaier
la source
Merci pour les informations intéressantes données dans votre réponse.
julianfperez
Pourquoi est-ce plus rapide si vous enregistrez les intermédiaires?
Federico Poloni
@FedericoPoloni: J'avais écrit qu'il est légèrement plus rapide de ne pas sauver les intermédiaires.
Arnold Neumaier
@ArnoldNeumaier Ooh désolé d'avoir mal lu. :)
Federico Poloni
14

Pour commencer, je n'utiliserais pas de variables intermédiaires, mais des crochets. À moins, bien sûr, que les résultats intermédiaires vous intéressent, mais je suppose que non.

J'ai essayé ce qui suit dans 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.

Je dois dire, cependant, que c'est assez effrayant. J'ai toujours supposé que Matlab serait intelligent sur l'ordre de multiplication de la matrice, car c'est un problème connu avec des solutions simples et efficaces.

Pedro
la source
Vous avez manqué la partie où les matrices sont 3x3? :)
Aron Ahmadia
2
@AronAhmadia: Oups ... J'ai raté ça, merci. Je suppose que pour ces tailles de matrice, tout le problème est théorique, mais je suis toujours surpris des résultats pour le grand N.
Pedro
7
Je suppose que MATLAB suit les règles de priorité C pour l'évaluation des expressions car les mathématiques à virgule flottante ne sont pas associatives et ils doivent supposer que vous savez ce que vous faites :)
Aron Ahmadia
2
@Pedro: Merci pour votre réponse. Pour la dimension matricielle 3x3, j'ai vérifié que votre solution est également meilleure que la multiplication matricielle habituelle (sans crochets).
julianfperez
+1 merci d'avoir montré un moyen simple et facile de mesurer le temps d'exécution
Steven Magana-Zook
14

Étant donné que les matrices sont si petites, tout le coût va être en surcharge d'appel. Si vous effectuez la transformation plusieurs fois, il sera plus rapide de précalculer D=A*B*Cune fois puis d'appliquer pour chaque vecteur v_f=D*v_i. Vous pouvez également envisager de l'intégrer dans un fichier mex.

Aron Ahmadia
la source
Merci pour votre réponse. Dans mon cas, les matrices sont des matrices de rotation (elles dépendent d'une valeur angulaire et cela change) donc le produit A B C n'est pas toujours le même.
julianfperez