eigenfuncs
Quaternion to rotation vector and other miscellaneous useful functions using the Eigen math library
#include <boost/math/special_functions/sinc.hpp> #include <Eigen/Dense> #include <Eigen/Geometry> Eigen::Quaterniond quat_from_rotvec(Eigen::Vector3d r) { double angle = r.norm(); Eigen::Quaterniond res; res.w() = cos(angle/2); res.vec() = boost::math::sinc_pi(angle/2)/2 * r; // = sin(angle/2) * r.normalized(), without the singularity return res; } Eigen::Vector3d rotvec_from_quat(Eigen::Quaterniond q) { q = q.normalized(); if(q.w() < 0) q = Eigen::Quaterniond(-q.coeffs()); return 2/boost::math::sinc_pi(acos(std::min(1., q.w()))) * q.vec(); } template<int N> Eigen::Matrix<double, N, N> cholesky(Eigen::Matrix<double, N, N> x) { Eigen::LDLT<Eigen::Matrix<double, N, N> > ldlt = x.ldlt(); return ldlt.transpositionsP().transpose() * Eigen::Matrix<double, N, N>(ldlt.matrixL()) * Eigen::Matrix<double, N, 1>(ldlt.vectorD().array().sqrt()).asDiagonal(); }
The cholesky function uses Eigen's LDLT decomposition so it can handle positive semidefinite matrices.