这个模块提供数学和线性代数工具,基于Eigen
向量和矩阵容器
重新命名了Eigen
的一些基本类型,是列优先的
Vec2 a single 2d point stored as a column matrix (x,y),
Vec3 a single 3d point stored as a column matrix (x,y,z),
Vec2f, Vec3f float version.
Vec a vector of value (double precision),
Vecf a vector of floating point value,
Mat the generic matrix container,
Mat2X a collection of 2d points stored by column,
Mat3X a collection of 3d points stored as column.
// Create a set of 2D points store as column
Mat2X A(2, 5);
A << 1, 2, 3, 4, 5,
6, 7, 8, 9, 10;
A.col(); // return a column vector : (1,6)^T
A.row(); // return a row vector : (1,2,3,4,5)
Mat3 testMatrix = Mat3::Identity();
testMatrix.setIdentity();
Vec3 e; e[0]= 1; e[1] = 2; e[2] = 3;
Mat3 R = LookAt(e); //只知道旋转后,z轴方向是(1,2,3)。x'=Rx
Mat3 I = Mat3::Identity();
Mat3 RRT = R*R.transpose();
Mat3 RTR = R.transpose()*R;
MeanAndVarianceAlongRows(points, &mean, &variance);
还有l1_solver, LM
源代码
eigen_alias_definition.hpp
定义了常用的别名,及对eigen
的内存分配进行处理
/// 3d vector using double internal format
using Vec3 = Eigen::Vector3d;
/// 2d vector using int internal format
using Vec2i = Eigen::Vector2i;
/// 2d vector using float internal format
using Vec2f = Eigen::Vector2f;
因为eigen
有SSE加速,需要内存对齐。所以需要进行处理一下。在基本处理上,加上了几个explict
和initializer list constructor support
numeric.hpp、numeric.cpp
内容
- 一些几何小函数,如叉积、旋转矩阵生成
- 一些实用的小函数,如求矩阵数据的统计参数
MeanAndVarianceAlongRows
、输出保存exportMatToTextFile
c++知识
eigen
里面对象的操作:a.array() * b.array()).sum() /a.norm() / b.norm();
、Vec3 yc = zc.cross(xc);
<cmahth>
里面有圆周率M_PI
<numeric>
里面有针对利用迭代器计算的方便操作,如iota
poly.h
内容
计算三次方程和四次方程的根
c++知识
<complex>
里面有关于负数运算的函数
nullspace.hpp
内容
Ax=0, s.t. :|x|=1
的最小二乘解
double Nullspace
(
const Eigen::Ref<const Mat> & A,
Eigen::Ref<Vec> nullspace
)
c++知识
- 可以不用模板函数,且参数是eigen类
accumulator_trait.hpp
内容
一个模板及其特殊化
template<typename T>
struct Accumulator { using Type = T; };
template<>
struct Accumulator<unsigned char> { using Type = float; };
extract_columns.hpp
内容
一个模板函数
template <typename TCols>
Mat ExtractColumns
(
const Eigen::Ref<const Mat> &A,
const TCols &columns
)