Multiplicación matricial de MATLAB (el mejor enfoque computacional)

10

Tengo que hacer una transformación de coordenadas entre dos sistemas de referencia (ejes). Para eso, se deben multiplicar tres matrices ( ) debido a que se utilizan algunos ejes intermedios. He pensado en dos enfoques para resolver esto:3×3

Método # 1 : Hacer la multiplicación directamente, es decir,

vf=R1 R2 R3 vi

Método # 2 : dividir en pasos:

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

dónde:

R 2 R 3 3 × 3R1 , y son matricesR2R33×3

v i v 3 i v 23 3 × 1vf , , , son vectoresviv3iv233×1

Me gustaría saber qué método es más eficiente computacionalmente (menos tiempo) para hacer la transformación (esto se hará muchas veces).

julianfperez
fuente
44
Usa cuaterniones .
Chris Taylor
@ ChrisTaylor: Muchas gracias por su sugerencia.
julianfperez
2
Por favor, no cruce.
Estafado
2
Tenga en cuenta que hubo dos preguntas publicadas en forma cruzada aquí y StackOverflow. Las preguntas y sus comentarios y respuestas se han fusionado en este.
Aron Ahmadia
@Will y AronAhmadia: lo siento. No sabía que la publicación cruzada está prohibida. Siempre he publicado mis preguntas en StackOverflow, pero hoy encontré este nuevo sitio y pensé que tal vez podría encontrar ayuda aquí también.
julianfperez

Respuestas:

17

Matlab interpreta secuencias de multiplicaciones y / o divisiones de izquierda a derecha. Por lo tanto, es mucho más caro que A ( B (ABCv , ya que tiene dos productos de matriz y un producto de matriz-vecor en lugar de tres productos de matriz de vectores.A(B(Cv))

Por otro lado, debería ser un poco más rápido que si guarda los intermedios en vectores separados, como sugiere su segundo método.A(B(Cv))

Para averiguar en general cómo medir el impacto de pequeñas diferencias de programación en los cálculos a gran escala, escriba en el mensaje de Matlab '' perfil de ayuda ''.

Arnold Neumaier
fuente
Gracias por la interesante información dada en su respuesta.
julianfperez
¿Por qué es más rápido si guardas los intermedios?
Federico Poloni
@FedericoPoloni: había escrito que es un poco más rápido no guardar los intermedios.
Arnold Neumaier el
@ArnoldNeumaier Ooh, lo siento, leí mal. :)
Federico Poloni el
14

Para empezar, no usaría variables intermedias, sino paréntesis. A menos, por supuesto, que esté interesado en los resultados intermedios, pero supongo que no.

Intenté lo siguiente en 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.

Sin embargo, tengo que decir que esto es bastante aterrador. Siempre he asumido que Matlab sería inteligente sobre el orden de multiplicación de la matriz, ya que este es un problema conocido con soluciones simples y eficientes.

Pedro
fuente
¿Te perdiste la parte donde las matrices son 3x3? :)
Aron Ahmadia
2
@AronAhmadia: Oops ... Perdí eso, gracias. Supongo que para esos tamaños de matriz, todo el problema es discutible, pero todavía estoy sorprendido por los resultados para el gran N.
Pedro
77
Supongo que MATLAB está siguiendo las reglas de precedencia en C para la evaluación de expresiones porque las matemáticas de coma flotante no son asociativas y deben suponer que sabes lo que estás haciendo :)
Aron Ahmadia
2
@Pedro: Gracias por tu respuesta. Para la dimensión de matriz 3x3, he verificado que su solución también es mejor que la multiplicación de matriz habitual (sin corchetes).
julianfperez
+1 gracias por mostrar una manera simple y fácil de medir el tiempo de ejecución
Steven Magana-Zook
14

Dado que las matrices son tan pequeñas, todo el costo estará en gastos generales de llamadas. Si va a realizar la transformación muchas veces, será más rápido precalcular D=A*B*Cuna vez y luego para cada vector aplicado v_f=D*v_i. También podría considerar llevar esto a un archivo mex.

Aron Ahmadia
fuente
Gracias por su respuesta. En mi caso, las matrices son de rotación (dependen de un valor angular y esto cambia) por lo que el producto A B C no siempre es el mismo.
julianfperez