Quiero multiplicar 2 cuaterniones, que se almacenan en una estructura cv :: Mat. Quiero que la función sea lo más eficiente posible. Tengo el siguiente código hasta ahora:Eficiente multiplicación de cuaterniones C++ usando cv :: Mat
/** Quaternion multiplication
*
*/
void multiplyQuaternion(const Mat& q1,const Mat& q2, Mat& q)
{
// First quaternion q1 (x1 y1 z1 r1)
const float x1=q1.at<float>(0);
const float y1=q1.at<float>(1);
const float z1=q1.at<float>(2);
const float r1=q1.at<float>(3);
// Second quaternion q2 (x2 y2 z2 r2)
const float x2=q2.at<float>(0);
const float y2=q2.at<float>(1);
const float z2=q2.at<float>(2);
const float r2=q2.at<float>(3);
q.at<float>(0)=x1*r2 + r1*x2 + y1*z2 - z1*y2; // x component
q.at<float>(1)=r1*y2 - x1*z2 + y1*r2 + z1*x2; // y component
q.at<float>(2)=r1*z2 + x1*y2 - y1*x2 + z1*r2; // z component
q.at<float>(3)=r1*r2 - x1*x2 - y1*y2 - z1*z2; // r component
}
¿Es esta la manera más rápida con OpenCV? ¿Sería más rápido usar aritmética de punto fijo?
16 multiplicaciones y 12 incorporaciones: parece que no hay mucho que mejorar. ¡Haga la función en línea! Espero que estas llamadas "a" no sean llamadas a funciones (es decir, que deberían estar en línea). – JohnB
Es un miembro de openCV de la clase Mat. Creo que es el método más rápido para acceder a Mat Matment, pero no estoy seguro. http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat –
¿Tan eficiente como sea posible? En primer lugar, no use una clase de matriz que haga la asignación dinámica de memoria y el recuento de referencias para algo tan trivial como una matriz de cuatro componentes. Ese es exactamente un caso de uso perfecto para la nueva clase 'Matx', en referencia a una de sus otras preguntas. –