通用的线性代数库
BLAS、LAPACK、CLAPACK、Eigen、Armadillo
具体语言
C
GNU Science Library(GSL,C) :GUN科学运算库
GSL是一个独立的C库,没有任何基于BLAS的快-便携性
mygsl是一个基于GSL库的个性化开源数值计算项目.
clapack- Linear Algebra Package for C
C++-矩阵运算-Eigen-几何矩阵变换
Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法-线性代数、矩阵、向量操作等运算的C++库
lapack++ Linear Algebra Package in c++
Blitz++:高效率的数值计算函数库
POOMA
Java
JOML – Java OpenGL Math Library
JOML--A Java math library for OpenGL rendering calculations
https://github.com/JOML-CI/JOML
Python 矩阵运算
numpy
LAPACK Linear Algebra Package,是著名的线性代数库,与BLAS一样,既表示API接口规范也表示具体用FOTRAN实现的
Eigen
提供了快速的矩阵线性代数运算,矩阵、向量、旋转矩阵、变换矩阵。
Eigen是纯头文件搭建成的库,使用时只需引入Eigen的头文件即可,不需要链接库文件target_link
. Sophus:一个较好的李代数库,是 Strasdat 维护的 Sophus 库 。Sophus 库支持 SO(3) 和 SE(3),此外还含有二维运动 SO(2), SE(2) 以及相似变换Sim(3) 的内容。它是直接在 Eigen 基础上开发的
ceres:Ceres 库面向通用的最小二乘问题的求解库
安装命令
sudo apt-get install libeigen3-dev
使用指令来查看apt包中eigen的版本
apt show libeigen3-dev
包含头文件
包含头文件 <eigen3/Eigen/Dense>
因为默认安装路径在 /usr/include/eigen3 下, 编译器去查找路径时只能找到 include 文件下,
故不可直接包含头文件 <Eigen/Dense>, 需包含头文件 <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Dense>
使用
CMakeLists.txt需要添加头文件 include_directories("/usr/include/eigen3");
详情概要
Core #include <Eigen/Core> 矩阵和数组 (向量) 类 (Matrix, Array),基于线性代数还有数组操作
Geometry #include <Eigen/Geometry> 变换,平移,缩放,2D 旋转和 3D 旋转 (包括四元数和角轴)
Dense #include <Eigen/Dense> 包括 Core, Geometry, LU, Cholesky, SVD, QR, Eigenvalues 的头文件
Eigen #include <Eigen/Eigen> 包括 Dense 和 Sparse 的头文件
Eigen
Eigen::Matrix4f 用来表示变换矩阵
Eigen::AngleAxisd 用来表示旋转向量
1、旋转矩阵(3X3):Eigen::Matrix3d
2、旋转向量(3X1):Eigen::AngleAxisd
Eigen::Matrix3d rotation_matrix
Eigen::AngleAxisd rotation_vector(rotation_matrix);
Eigen::Quaterniond 用来表示四元数
Eigen::Vector3d 用来表示欧拉角
Eigen::Affine3d 用来表示仿射矩阵
Eigen::Translation3d trans_;
Matrix3f r; // rotation matrix
Vector3f t; // translation vector
typedef Matrix<float, 3, 1> Vector3f;
i(meaning int)、f(meaning float)、d(meaning double)、cf(meaning complex)或 cd(meaning complex)
欧式变换也称为等距变换(Isometry Transform)
Eigen::Isometry3d T_imu_to_lidar = Eigen::Isometry3d::Identity()
.matrix():返回变换对应的矩阵(可修改),包括平移部分和旋转部分; T_imu_to_lidar.matrix()才是变换矩阵,做运算时需加.matrix()后缀;
旋转矩阵左乘是相对固定坐标系,右乘是相对当前坐标系
//求取雷达坐标系到enu世界坐标系的转换矩阵,以enu坐标系为基准
Eigen::Isometry3d T_lidar_to_enu = T_imu_to_enu * system_config.T_lidar_to_imu;
2、求取点的坐标从坐标系A转到坐标系B
Eigen::Vector3d position_ecef;
position_ecef = system_config.T_enu_to_ecef * position_enu; // 得到当前时刻雷达在地心地固坐标系的位置
?? np.dot()
T_lidar_to_enu = T_lidar_to_imu*T_imu_to_enu ??
Eigen库 旋转矩阵和平移向量组成齐次变换矩阵
Matrix4f trans; // transformation matrix
trans.setIdentity(); // set to identity
trans.block<3,3>(0,0) = r; // first 3x3 block set to rotation matrix
trans.block<3,1>(0,3) = t; // fourth column set to translation vector
Transform<float,3,Affine> T = Translation3f(p) * AngleAxisf(a,axis) * Scaling(s);
而 Affine3d T是一个4*4齐次矩阵变换。
概念
刚体变换 仿射变换 投影变换 非线性变换
刚体变换是指在三维空间中,把一个物体做旋转、平移,是一种保持物体大小和形状不变的仿射变换刚体变换又称为欧式变换、齐次变换
仿射变换(Affine Transformation)在2D和3D坐标下的变换矩阵和性质及齐次坐标系(Homogeneous Coordinates)的应用
平移(Translation)、旋转(Rotation)、缩放(Scaling)、剪切(Shearing)
Collineraity共线性且点之间距离比例不变
保持共线性,并不一定指的是直线,比如一个圆经过仿射变换后它上的所有点都还会在一个圆弧上。同时线上点的距离比例保持不变
参考
Eigen中变换矩阵Eigen::Isometry3d T的使用方法 https://zhuanlan.zhihu.com/p/610439768
https://eigen.tuxfamily.org/index.php?title=Main_Page