【发布时间】:2012-06-02 14:34:36
【问题描述】:
我想将 2 个四元数相乘,它们存储在 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
}
这是使用 OpenCV 最快的方法吗?使用定点算术会最快吗?
【问题讨论】:
-
16 次乘法和 12 次加法——对我来说似乎没有太大的改进空间。使函数内联!我希望这些“at”调用不是函数调用(即它们应该是内联的)。
-
它是 Mat 类的 openCV 成员。我认为这是访问 Mat elment 的最快方法,但我不确定。 opencv.willowgarage.com/documentation/cpp/…
-
尽可能高效?首先,不要对像四分量数组这样微不足道的东西使用执行动态内存分配和引用计数的矩阵类。对于新的
Matx类,这正是一个完美的用例,参考您的其他问题之一。 -
嗯,我得试试那个新课,谢谢
-
可能值得从 q2 的洗牌版本设置 4X4,然后矩阵相乘;有点模仿子弹物理代码的作用。使用 SSE4,opencv - 应该有一个非常紧凑的矩阵乘法。
标签: c++ opencv quaternions