【C++】Eigen库(线性代数库)使用介绍

Eigen 库介绍:


一、Eigen 库简介

Eigen 是一个开源的 C++ 模板库,专注于线性代数运算(矩阵、向量、数值求解等)。其特点包括:

  • 高性能:通过表达式模板优化(编译时计算),接近手写汇编的速度。

  • 纯头文件:无需编译库,直接包含头文件即可使用。

  • 丰富的功能:支持矩阵运算、线性求解、特征值分解、稀疏矩阵等。

  • 易用 API:语法类似 MATLAB,直观易学。

  • 跨平台:支持 Linux/Windows/macOS,兼容 GCC/Clang/MSVC 等编译器。

  • 模块化架构

    #include <Eigen/Core>      // 基础矩阵运算
    #include <Eigen/LU>        // 矩阵分解
    #include <Eigen/SVD>       // 奇异值分解
    #include <Eigen/Sparse>    // 稀疏矩阵
    

二、安装 Eigen

方法 1:包管理器安装(推荐)
  • Ubuntu/Debian:
    sudo apt-get install libeigen3-dev
    
  • MacOS (Homebrew):
    brew install eigen
    
方法 2:源码安装
  1. 下载源码:Eigen 官网
  2. 解压后,将 Eigen 目录复制到系统头文件路径(如 /usr/include/):
    cp -r eigen-3.4.0/Eigen /usr/include/
    

三、基础用法示例

1. 包含头文件
#include <iostream>
#include <Eigen/Dense> // 核心矩阵运算
using namespace Eigen;
2. 声明矩阵和向量
// 3x3 双精度动态矩阵
MatrixXd mat(3, 3);  

// 3维双精度向量
Vector3d vec(1.0, 2.0, 3.0); 

// 固定大小矩阵(编译时确定)
Matrix3d mat_fixed;  
3. 初始化矩阵
// 逗号初始化
mat << 1, 2, 3,
       4, 5, 6,
       7, 8, 9;

// 随机矩阵
mat = MatrixXd::Random(3, 3); 

// 单位矩阵
mat = Matrix3d::Identity(); 

Matrix4d Z = Matrix4d::Zero();// 零矩阵

 // 映射外部内存(零拷贝)
float data[9] = {1,2,3,4,5,6,7,8,9};
Map<Matrix3f> M(data);  // 直接操作 data 内存
4. 基本运算
// 矩阵乘法
MatrixXd result = mat * mat_fixed;

// 向量点积
double dot = vec.dot(vec);

// 矩阵求逆(直接法,小矩阵适用)
Matrix3d inv_mat = mat.inverse();

// 解线性方程组 Ax = b
Vector3d x = mat.lu().solve(vec); // LU分解

四、常用操作速查表

操作代码示例
矩阵加减MatrixXd C = A + B;
标量乘法MatrixXd D = 2.5 * A;
转置MatrixXd AT = A.transpose();
元素求和double sum = A.sum();
最大值/最小值double max = A.maxCoeff();
矩阵块操作MatrixXd block = A.block<2,2>(1,1);
按元素乘法MatrixXd E = A.cwiseProduct(B);
计算特征值EigenSolver<MatrixXd> es(A);

五、高级功能

1. 矩阵分解
// QR 分解
HouseholderQR<MatrixXd> qr(A);
VectorXd x = qr.solve(b);

// SVD 分解
JacobiSVD<MatrixXd> svd(A, ComputeThinU | ComputeThinV);
MatrixXd U = svd.matrixU();
2. 稀疏矩阵
#include <Eigen/Sparse>
SparseMatrix<double> sp_mat(1000, 1000); // 稀疏矩阵
sp_mat.insert(0, 1) = 1.0;              // 插入非零元素
3. 几何变换(旋转、平移)
#include <Eigen/Geometry>
AngleAxisd rotation(M_PI/2, Vector3d::UnitZ()); // 绕Z轴旋转90°
Matrix3d rot_matrix = rotation.toRotationMatrix();

六、性能优化建议

  1. 启用编译器优化:编译时添加 -O3 标志。
  2. 固定大小矩阵:对小矩阵(≤4x4)使用 Matrix4d 等固定类型。
  3. 避免自动求值:使用 .noalias() 防止临时变量:
    C.noalias() = A * B; // 避免创建临时矩阵
    
  4. 内存对齐:对固定大小矩阵使用 EIGEN_MAKE_ALIGNED_OPERATOR_NEW

七、官方资源


八、调试技巧

若遇到奇怪的编译错误:

  1. 检查矩阵维度是否匹配。
  2. 确保使用 MatrixXd(动态)或 Matrix3d(固定)正确类型。
  3. 尝试 EIGEN_INITIALIZE_MATRICES_BY_ZERO 宏初始化零矩阵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴雨日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值