简单介绍C++中线性代数运算库Eigen

Eigen 是一个高性能的 C++ 模板库,专注于线性代数、矩阵和向量运算,广泛应用于科学计算、机器学习和计算机视觉等领域。以下是对 Eigen 库的详细介绍:


1. 概述

  • 核心功能:支持矩阵、向量运算,包括基本算术、矩阵分解(如 LU、QR、SVD)、几何变换(旋转、平移)等。
  • 特点
    • 表达式模板:通过延迟计算优化性能,减少临时变量。
    • 多数据类型 :支持 floatdoublestd::complex 等。
    • 存储顺序:默认列优先(类似 Fortran),可选行优先(兼容 C 风格数组)。
    • 动态与静态矩阵MatrixXd(动态大小双精度)、Vector3f(固定大小 3 维单精度)等。
    • 零依赖:纯头文件实现,无需额外编译。
  • 许可证:MPL2(宽松开源协议,允许商业使用)。

2. 安装与配置

  • 安装:从 Eigen 官网 下载后,将头文件目录添加到编译器包含路径。

  • 包含头文件

    c 复制代码
    #include <Eigen/Core>      // 核心模块(Matrix、Vector)
    #include <Eigen/Dense>     // 常用模块(包含 Core、LU、QR 等)
    #include <Eigen/Geometry> // 几何变换

3. 基本用法

3.1 定义矩阵与向量

c 复制代码
Eigen::MatrixXd mat(3, 3);     // 动态大小双精度矩阵
Eigen::Vector3f vec;           // 固定大小3维单精度向量
Eigen::Matrix3f mat_fixed;     // 固定大小3x3单精度矩阵

3.2 初始化

c 复制代码
mat = Eigen::MatrixXd::Random(3, 3);  // 随机初始化
vec << 1, 2, 3;                      // 逗号初始化
mat_fixed = Eigen::Matrix3f::Identity(); // 单位矩阵

3.3 算术运算

c 复制代码
Eigen::MatrixXd a = Eigen::MatrixXd::Random(2, 2);
Eigen::MatrixXd b = Eigen::MatrixXd::Random(2, 2);
Eigen::MatrixXd c = a + b;          // 逐元素加法
Eigen::MatrixXd d = a * b;          // 矩阵乘法
Eigen::MatrixXd e = a.transpose();  // 转置

3.4 解线性方程组

c 复制代码
Eigen::Matrix3f A;
Eigen::Vector3f b, x;
A << 1, 2, 3, 
     4, 5, 6, 
     7, 8, 10;
b << 3, 3, 4;
x = A.lu().solve(b); // LU分解求解Ax = b

4. 高级功能

4.1 矩阵分解

c 复制代码
// QR分解(最小二乘解)
x = A.householderQr().solve(b);
// SVD分解(奇异值分解)
Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);

4.2 几何模块

c 复制代码
Eigen::AngleAxisd rotation(M_PI/4, Eigen::Vector3d::UnitZ()); // Z轴旋转45度
Eigen::Vector3d point(1, 0, 0);
point = rotation * point; // 应用旋转变换

4.3 内存映射(Map类)

c 复制代码
double data[] = {1, 2, 3, 4};
Eigen::Map<Eigen::VectorXd> vec_map(data, 4); // 将数组映射为向量

5. 性能优化

  • 表达式模板 :自动合并操作(如 a = b + c + d 合并为单层循环)。
  • 固定大小矩阵:小型矩阵(如 4x4)在栈上分配,避免堆开销。
  • SIMD 优化 :启用编译器选项(如 -march=native)利用 SSE/AVX 指令集。

6. 注意事项

  • 别名问题:避免操作中同时读写同一矩阵:

    c 复制代码
    // 错误写法:a = a.transpose();
    a = a.transpose().eval();        // 正确写法1
    a.transposeInPlace();             // 正确写法2
  • auto 陷阱:延迟计算可能导致意外结果:

    c 复制代码
    auto tmp = a * b; // tmp是表达式对象,非实际矩阵
    Eigen::MatrixXd tmp_eval = a * b; // 立即求值
  • 内存对齐 :固定大小矩阵需注意内存对齐(使用 EIGEN_MAKE_ALIGNED_OPERATOR_NEW)。


7. 应用场景

  • 科学计算:解微分方程、优化问题。
  • 计算机视觉:三维重建、相机标定(如 OpenCV 可集成 Eigen)。
  • 机器学习:线性回归、PCA 降维。
  • 物理引擎:刚体变换、碰撞检测。

8. 对比其他库

库名 特点
Armadillo 语法类似 Matlab,依赖 LAPACK。
OpenCV 侧重图像处理,内置矩阵但功能较局限。
BLAS/LAPACK 底层标准,需手动管理内存。

Eigen 凭借其高性能、易用性和灵活性,成为 C++ 中线性代数运算的首选库之一。深入掌握其特性后,可在项目中高效实现复杂的数学运算。

相关推荐
快点好好学习吧12 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q13 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳013 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾13 分钟前
php 对接deepseek
android·开发语言·php
CSDN_RTKLIB16 分钟前
WideCharToMultiByte与T2A
c++
2601_9498683617 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计31 分钟前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
蒹葭玉树41 分钟前
【C++上岸】C++常见面试题目--操作系统篇(第二十八期)
linux·c++·面试
qq_1777673742 分钟前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
一匹电信狗44 分钟前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl