使用 cv::Mat 进行高效的C++四元数乘法
Efficient C++ quaternion multiplication using cv::Mat
我想乘以 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最快的方法吗?使用定点算术会最快吗?
在本教程中,介绍了访问不同像素的不同方法。与直接像素访问相比,Mat::at
函数的速度慢了大约 10%,这可能是由于调试模式下的额外检查。
如果您真的不喜欢性能,您应该使用文本中提到的 3 种不同方法重写您的方法,然后进行配置文件以找到最适合您情况的方法。
有一个 ARM 向量浮点四元数乘法,我现在找不到。我可以找到这个 SIMD 库:
子弹 3D 游戏多物理场库
四元数通常用于旋转 3D 向量,因此您可以考虑检查一个四元数是否为纯向量(即标量或实数部分为零)。这可以将您的工作减少到 12 次乘法、8 次加/减和 1 个符号翻转。
您还可以在两个纯向量上使用四元数乘法来同时计算它们的点积和叉积,因此对这种特殊情况进行测试也可能是值得的。如果两个四元数都是纯向量,你只需要做 9 次乘法、5 次加/减和 1 次符号翻转。
相关文章:
- 单元测试欧拉到四元数实现失败
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 想要将 CGAL 与四元数相结合是否合乎逻辑
- Eigen::Quaternion FromTwoVectors() 不返回有效的四元数
- C++四元数方程程序
- 四元数旋转不起作用
- 四元数和翻译
- 使用四元数防止绕某个轴旋转
- 如何使用四元数来描述超过360度的旋转角度?
- 四元数旋转错误
- 为什么我简单的四元数乘法比SSE快
- 特征:将矩阵3d旋转转换为四元数
- 从四元数查看矩阵
- 用四元数绕轴旋转矢量
- 基于四元数的相机不需要的卷轴
- 在C++中使用1D FFT的四元数FFT
- 四元数到轴的角度
- 四元数 -> 欧拉角 -> 旋转矩阵问题 (GLM)