【C++开源神器】Eigen线性代数库超全教程 一、Eigen是什么为什么必学Eigen是一款高性能、开源、跨平台的 C 线性代数库专门用于矩阵、向量、数值计算广泛应用于SLAM、机器人、自动驾驶、机器学习、图像处理、科学计算领域。Eigen 核心优势✅纯 Header-Only无需编译、无需链接导入头文件直接用✅零依赖不依赖第三方库跨平台Win/Linux/Mac/嵌入式✅性能极强自动优化循环、内存对齐、SIMD加速接近MKL/OpenBLAS性能✅语法极简高度贴近 Matlab上手成本极低✅功能全覆盖矩阵运算、特征值、奇异值、最小二乘、线性方程组、矩阵分解开源地址https://eigen.tuxfamily.org/二、Eigen 环境搭建Windows/Linux通用1. 环境要求支持 C11 及以上兼容所有主流编译器GCC、Clang、MSVC2. 快速集成步骤官网下载 Eigen 源码或 git 克隆将Eigen文件夹直接放入项目包含目录代码中直接#include Eigen/Dense即可使用CMake 最简配置cmake_minimum_required(VERSION 3.10) project(EigenDemo) set(CMAKE_CXX_STANDARD 11) # 配置Eigen头文件路径 include_directories(./eigen) add_executable(demo main.cpp)三、Eigen 基础入门新手必看1. 核心命名空间所有 Eigen 类、函数都在Eigen命名空间建议全局引入#include iostream #include Eigen/Dense using namespace Eigen; using namespace std;2. 矩阵与向量基础类型Eigen 模板格式Matrix类型, 行数, 列数固定大小性能更高推荐小矩阵使用动态大小运行时确定尺寸适配未知尺寸数据// 常用固定矩阵 Matrix2d m2d; // 2x2 double Matrix3d m3d; // 3x3 double Matrix4d m4d; // 4x4 double // 常用固定向量 Vector2d v2d; // 2维列向量 Vector3d v3d; // 3维列向量 Vector4d v4d; // 4维列向量 // 动态大小矩阵/向量 MatrixXd mat_x; // 任意大小double矩阵 VectorXd vec_x; // 任意大小double向量四、超多实战示例基础初始化入门必练示例1常规初始化 赋值int main() { // 3x3 矩阵手动赋值 Matrix3d m; m 1, 2, 3, 4, 5, 6, 7, 8, 9; cout 3x3矩阵\n m endl; // 2维向量赋值 Vector2d v(10, 20); cout 向量\n v endl; return 0; }示例2特殊矩阵零矩阵、单位矩阵、全1矩阵int main() { // 3x3 零矩阵 Matrix3d zero_mat Matrix3d::Zero(); cout 零矩阵\n zero_mat endl; // 3x3 单位矩阵 Matrix3d eye_mat Matrix3d::Identity(); cout 单位矩阵\n eye_mat endl; // 3x3 全1矩阵 Matrix3d ones_mat Matrix3d::Ones(); cout 全1矩阵\n ones_mat endl; // 动态矩阵 零初始化 MatrixXd zero_x MatrixXd::Zero(4,5); // 4行5列 cout 4x5零矩阵\n zero_x endl; return 0; }示例3随机矩阵初始化int main() { // 随机矩阵范围[-1,1] Matrix3d rand_mat Matrix3d::Random(); cout 随机矩阵\n rand_mat endl; // 动态随机矩阵 MatrixXd rand_x MatrixXd::Random(3,4); cout 3x4随机矩阵\n rand_x endl; return 0; }示例4矩阵维度获取与重置大小int main() { MatrixXd mat(3,4); mat 1,2,3,4, 5,6,7,8, 9,10,11,12; cout 行数 mat.rows() endl; cout 列数 mat.cols() endl; cout 元素总数 mat.size() endl; // 重置尺寸动态矩阵可用 mat.resize(2,2); cout 重置后矩阵\n mat endl; return 0; }五、矩阵基础运算加减乘、转置、求逆、行列式示例5矩阵加减、数乘int main() { Matrix2d a,b; a 1,2, 3,4; b 5,6, 7,8; cout ab \n ab endl; cout a-b \n a-b endl; cout a*2 \n a*2 endl; cout a/2 \n a/2 endl; return 0; }示例6矩阵乘法、对应元素相乘重点区分*矩阵数学乘法.array() *对应元素相乘点乘/哈达玛积int main() { Matrix2d a,b; a 1,2, 3,4; b 5,6, 7,8; // 矩阵乘法 cout 矩阵乘法\n a*b endl; // 对应元素相乘 cout 元素相乘\n a.array() * b.array() endl; return 0; }示例7矩阵转置、共轭、求逆、行列式int main() { Matrix2d a; a 1,2, 3,4; cout 原矩阵\n a endl; cout 转置\n a.transpose() endl; cout 行列式 a.determinant() endl; cout 逆矩阵\n a.inverse() endl; return 0; }示例8矩阵求和、均值、最大值、最小值int main() { Matrix3d a; a 1,2,3, 4,5,6, 7,8,9; cout 总和 a.sum() endl; cout 均值 a.mean() endl; cout 最大值 a.maxCoeff() endl; cout 最小值 a.minCoeff() endl; return 0; }六、矩阵分块、行列提取高频实用示例9读取单行、单列int main() { Matrix3d a; a 1,2,3, 4,5,6, 7,8,9; cout 第0行 a.row(0) endl; cout 第1列\n a.col(1) endl; return 0; }示例10截取子矩阵分块操作int main() { Matrix4d a Matrix4d::Random(); cout 原4x4矩阵\n a endl; // 从(0,0)开始取2行2列 Matrix2d sub a.block(0,0,2,2); cout 2x2子块\n sub endl; return 0; }示例11修改单行、单列、子块int main() { Matrix3d a; a.setZero(); // 设置第0行 a.row(0) 1,2,3; // 设置第2列 a.col(2) 4,5,6; cout 修改后矩阵\n a endl; return 0; }七、向量运算点积、叉积、归一化示例12向量点积、叉积int main() { Vector3d v1(1,0,0); Vector3d v2(0,1,0); // 点积 double dot v1.dot(v2); cout 点积 dot endl; // 叉积 Vector3d cross v1.cross(v2); cout 叉积\n cross endl; return 0; }示例13向量模长、归一化int main() { Vector3d v(3,4,0); cout 模长 v.norm() endl; // 归一化自身改变 v.normalize(); cout 归一化后\n v endl; // 归一化副本自身不变 Vector3d v2 Vector3d(3,4,0).normalized(); cout 归一化副本\n v2 endl; return 0; }八、高阶核心解线性方程组求解 工程最常用示例14QR分解求解方程通用稳定int main() { // Ax b Matrix3d A; Vector3d b; A 1,2,3, 4,5,6, 7,8,10; b 3,6,9; Vector3d x A.colPivHouseholderQr().solve(b); cout 方程解 x\n x endl; // 验证误差 cout 误差 (A*x - b).norm() endl; return 0; }示例15正定矩阵 Cholesky 快速求解int main() { Matrix2d A; A 4, 2, 2, 5; Vector2d b(6,7); Vector2d x A.ldlt().solve(b); cout Cholesky求解结果\n x endl; return 0; }九、特征值与特征向量机器学习/矩阵分析必备示例16求解矩阵特征值、特征向量int main() { Matrix2d A; A 1, 2, 2, 1; EigenSolverMatrix2d solver(A); // 特征值 cout 特征值\n solver.eigenvalues() endl; // 特征向量 cout 特征向量\n solver.eigenvectors() endl; return 0; }十、实战最小二乘拟合工程高频拟合直线y kx b超实用数据分析案例示例17最小二乘拟合int main() { // 原始数据点 vectordouble x {1,2,3,4,5}; vectordouble y {2,4,5,7,8}; int n x.size(); MatrixXd A(n,2); VectorXd b(n); for(int i0;in;i) { A(i,0) x[i]; A(i,1) 1.0; b(i) y[i]; } // 最小二乘解 Vector2d res A.colPivHouseholderQr().solve(b); double k res(0); double b0 res(1); cout 拟合结果y k x b0 endl; return 0; }十一、Eigen 高频避坑指南新手必看1. 固定大小矩阵不要resizeMatrix3d 禁止 resize仅动态矩阵 MatrixXd 可用2. 赋值混淆问题m m.transpose()会出错必须写m.transposeInPlace()3. 矩阵不可逆不要直接inverse()奇异矩阵求逆会NaN优先用QR求解4. 元素运算必须加.array()直接 * 是矩阵乘法元素相乘必须用array模式5. 大矩阵优先用动态矩阵避免栈溢出固定矩阵适合小维度计算十二、总结Eigen 是 C 数值计算的万能神器相比手写矩阵运算、调用第三方重型库拥有无可替代的优势零依赖、高性能、极简语法、全覆盖线性代数能力。本文从环境搭建 - 基础初始化 - 矩阵运算 - 分块操作 - 解方程 - 特征值 - 最小二乘实战层层递进覆盖90%以上工程开发场景所有代码均可直接复制运行快速落地项目开发。附常用头文件说明#include Eigen/Dense全覆盖日常开发首选#include Eigen/Geometry姿态、四元数、旋转矩阵SLAM/机器人#include Eigen/SVD奇异值分解#include Eigen/Eigenvalues特征值求解

本月热点