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:
Método # 1 : Hacer la multiplicación directamente, es decir,
Método # 2 : dividir en pasos:
dónde:
R 2 R 3 3 × 3 , y son matrices
v i v 3 i v 23 3 × 1 , , , son vectores
Me gustaría saber qué método es más eficiente computacionalmente (menos tiempo) para hacer la transformación (esto se hará muchas veces).
matrix
performance
matlab
julianfperez
fuente
fuente
Respuestas:
Matlab interpreta secuencias de multiplicaciones y / o divisiones de izquierda a derecha. Por lo tanto, es mucho más caro que A ∗ ( B ∗ (A ∗ B ∗ C∗ v , ya que tiene dos productos de matriz y un producto de matriz-vecor en lugar de tres productos de matriz de vectores.A ∗ ( B ∗ ( C∗ v ) )
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 ∗ ( C∗ v ) )
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 ''.
fuente
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:
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.
fuente
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*C
una vez y luego para cada vector aplicadov_f=D*v_i
. También podría considerar llevar esto a un archivo mex.fuente