Chcę pomnożyć 2 kwaterunki, które są przechowywane w strukturze cv :: Mat. Chcę, aby funkcja była jak najbardziej efektywna. Mam następujący kod do tej pory:Efektywne mnożenie kwaternionów C++ za pomocą 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
}
Czy to najszybszy sposób z OpenCV? Czy byłoby to najszybsze z arytmetyką o stałym punkcie?
16 multiplikacji i 12 dodatków - wydaje mi się, że nie mam wiele do zrobienia. Włącz funkcję inline! Mam nadzieję, że te wywołania "at" nie są wywołaniami funkcji (tj. Powinny być wbudowane). – JohnB
Jest to element openCV klasy Mat. Myślę, że jest to najszybsza metoda, aby uzyskać dostęp do Mat elment, ale nie jestem pewien. http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat –
Jak najbardziej efektywny? Nie używaj klasy macierzy, która dynamicznie przydziela alokację pamięci i liczenie odwołań do czegoś tak banalnego jak tablica czteroskładnikowa. Jest to idealny przypadek użycia dla nowej klasy 'Matx', w odniesieniu do jednego z twoich innych pytań. –