当前位置: 首页 > ds >正文

Eigen库介绍以及模块划分和相关示例代码

Eigen 是一个 C++ 的 高性能线性代数库,广泛用于计算机视觉、机器人、SLAM、机器学习等领域。它提供了矩阵和向量的计算、线性方程求解、特征值分解、SVD、QR、LU 等各种数值计算功能,语法类似 Matlab 且支持表达式模板优化。


一、Eigen 基本介绍

  • 官网:https://eigen.tuxfamily.org
  • 头文件库:完全基于模板,无需编译,使用时只需 #include <Eigen/Dense>
  • 跨平台:纯 C++ 实现,兼容 Windows、Linux、macOS。
  • 性能优化:通过表达式模板(expression templates)进行懒惰求值,极大地减少中间变量生成。
  • 支持多线程/并行:可选支持 OpenMP/Threading Building Blocks。

二、模块划分(头文件)

Eigen 按功能模块划分,每个模块是一个头文件:

模块头文件功能简介
Core#include <Eigen/Core>基础模块,向量、矩阵定义和操作
Dense#include <Eigen/Dense>包含 Core + 大部分常用模块
Geometry#include <Eigen/Geometry>坐标变换、旋转(Quaternion、AngleAxis)
LU#include <Eigen/LU>LU 分解
Cholesky#include <Eigen/Cholesky>适用于正定矩阵的分解(如 LLT)
QR#include <Eigen/QR>QR 分解
SVD#include <Eigen/SVD>奇异值分解
Eigenvalues#include <Eigen/Eigenvalues>特征值/特征向量分解
Sparse#include <Eigen/Sparse>稀疏矩阵支持
IterativeSolvers#include <Eigen/IterativeLinearSolvers>稀疏迭代求解器

三、示例代码

1. 基本矩阵定义与操作

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;int main() {Matrix3f A;   // 3x3 浮点矩阵A << 1, 2, 3,4, 5, 6,7, 8, 9;Vector3f b(1, 0, 1);Vector3f x = A * b;  // 矩阵向量乘法std::cout << "Result:\n" << x << std::endl;return 0;
}

2. 求解线性方程组 A x = b Ax = b Ax=b

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;int main() {Matrix3d A;A << 3, -1, 2,2,  0, 1,1,  1, -1;Vector3d b(10, 8, 3);Vector3d x = A.colPivHouseholderQr().solve(b);std::cout << "Solution x:\n" << x << std::endl;return 0;
}

3. 使用四元数做旋转(几何模块)

#include <Eigen/Geometry>
#include <iostream>
using namespace Eigen;int main() {Quaternionf q(AngleAxisf(M_PI / 4, Vector3f::UnitZ()));  // 绕Z轴旋转45°Vector3f v(1, 0, 0);  // 初始向量Vector3f v_rotated = q * v;std::cout << "Rotated vector: " << v_rotated.transpose() << std::endl;return 0;
}

4. 稀疏矩阵(Sparse)

#include <Eigen/Sparse>
#include <iostream>
using namespace Eigen;int main() {SparseMatrix<double> mat(3, 3);mat.insert(0, 0) = 1.0;mat.insert(1, 2) = 2.5;std::cout << "Sparse matrix:\n" << mat << std::endl;return 0;
}

5. 特征值分解

#include <Eigen/Eigenvalues>
#include <iostream>
using namespace Eigen;int main() {Matrix2d A;A << 1, 2,2, 1;EigenSolver<Matrix2d> solver(A);std::cout << "Eigenvalues:\n" << solver.eigenvalues() << std::endl;return 0;
}

四、使用建议与注意事项

建议或注意事项说明
使用 .transpose().inverse() 等不要重复计算保存结果变量再复用提高效率
避免临时矩阵构造表达式模板可以避免中间结果,但链式调用也要注意开销
支持 .block().col(), .row() 等块访问适用于子矩阵操作
.eval() 强制求值对懒求值表达式需要时强制计算
可结合 AutoDiff, Ceres, GTSAM 等使用Eigen 是这些库的基础数学模块
若数据量大,可启用 Eigen::setNbThreads(n)启用多线程计算

http://www.xdnf.cn/news/10796.html

相关文章:

  • 论文略读:LIMO: Less is More for Reasoning
  • Spring Boot中保存前端上传的图片
  • TASK OA 案例hook
  • Node.js 项目调试指南
  • 【小沐杂货铺】基于Three.JS构建IFC模型浏览器(WebGL、CAD、Revit、IFC)
  • 10种alpha想法。
  • Uiverse.io:免费UI组件库
  • 界面分析 - 上
  • RabbitMQ深度解析:从基础实践到高阶架构设计
  • leetcode93.复原IP地址:回溯算法中段控制与前导零处理的深度解析
  • Figma 中构建 Master Control Panel (MCP) 的完整设计方案
  • Docker 安装 Redis 容器
  • SQL 执行顺序详解
  • Laplace 噪声
  • 扩展数据(Concatenate)组件研究
  • 《AI Agent项目开发实战》DeepSeek R1模型蒸馏入门实战
  • Python----目标检测(《YOLO9000: Better, Faster, Stronger》和YOLO-V2的原理与网络结构)
  • SystemVerilog—三种线程之间的区别
  • 掌握HttpClient技术:从基础到实战(Apache)
  • IBM 与嘉士伯(Carlsberg)携手推进 SAP S/4HANA 数字化转型,打造啤酒行业新范式
  • Altium Disigner(16.1)学习-元器件封装
  • 从0开始学vue:pnpm怎么安装
  • 【深度学习】实验四 卷积神经网络CNN
  • 【设计模式-3.5】结构型——装饰器模式
  • 网络攻防技术二:密码学分析
  • 从0开始学vue:vue3和vue2的关系
  • VitalInsight智能体检报告解读
  • YOLOv5 :训练自己的数据集
  • SpringBoot(六)--- AOP、ThreadLocal
  • FastAPI安全认证:从密码到令牌的魔法之旅