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

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.lqws.cn/news/77347.html

相关文章:

  • NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用
  • Cursor 0.51 全网首歌新功能深度体验:Generate Memories 让 AI 编程助手拥有“记忆“
  • 【DAY37】早停策略和模型权重的保存
  • 微软PowerBI考试 PL-300学习指南
  • 【001】利用github搭建静态网站_essay
  • Go整合Redis2.0发布订阅
  • 6.2本日总结
  • leetcode90.子集II:排序与同层去重的回溯优化策略
  • Python 在金融中的应用- Part 1
  • Pytorch知识点2
  • dify应用探索
  • 【Go语言】Ebiten游戏库开发者文档 (v2.8.8)
  • 字节跳动开源图标库:2000+图标一键换肤的魔法
  • 神经网络中的梯度消失与梯度爆炸
  • 代码随想录60期day54
  • 牛客周赛 Round 94
  • 聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化
  • 数据结构之排序
  • 对抗攻击 Adversarial Attack
  • 实现按天更新vintage并热力图可视化
  • 【QT控件】QWidget 常用核心属性介绍 -- 万字详解
  • Python中sys模块详解
  • spring-boot接入websocket教程以及常见问题解决
  • 基于 51 单片机的智能饮水机控制系统设计与实现
  • 模块二:C++核心能力进阶(5篇) 篇一:《STL源码剖析:vector扩容策略与迭代器失效》
  • 达芬奇(DaVinci Resolve)下载安装教程
  • B树和B+树
  • MySQL DDL操作全解析:从入门到精通,包含索引视图分区表等全操作解析
  • 正则表达式在Java中的应用(补充)
  • Java垃圾回收机制详解:从原理到实践