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:
Méthode n ° 1 : effectuer la multiplication directement, c'est-à-dire
Méthode n ° 2 : diviser en étapes:
où:
, et sont des matrices
, , , sont vecteurs
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).
matrix
performance
matlab
julianfperez
la source
la source
Réponses:
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.A∗B∗C∗v A∗(B∗(C∗v))
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∗(C∗v))
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 ''.
la source
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:
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.
la source
É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*C
une fois puis d'appliquer pour chaque vecteurv_f=D*v_i
. Vous pouvez également envisager de l'intégrer dans un fichier mex.la source