如何用Eigen库进行C++矩阵运算?C++科学计算与线性代数库【教程】

Eigen核心三点:正确包含头文件、选对矩阵类型、用好表达式模板;纯头文件实现,无需BLAS,编译快、性能高;常用MatrixXd(动态双精度)和Matrix3d(固定3×3),构造即初始化,如MatrixXd A(3,4)创建3行4列零矩阵。

用Eigen做C++矩阵运算,核心就三点:正确包含头文件、选对矩阵类型、用好表达式模板。它不依赖外部BLAS,纯头文件实现,编译快、性能高,适合大多数科学计算场景。

快速上手:定义与初始化矩阵

Eigen里最常用的是MatrixXd(动态大小、double精度)和Matrix3d(固定3×3)。不需要手动管理内存,构造即初始化。

  • 动态矩阵MatrixXd A(3, 4); 创建3行4列全零矩阵;A 按行赋值(逗号分隔,分号换行)
  • 固定大小矩阵Matrix3f B; B.setIdentity(); 快速得单位阵;Vector3d v(1, 2, 3); 列向量也是Matrix的特例
  • 从C数组构造double raw[6] = {1,2,3,4,5,6}; Map M(raw, 2, 3); 零拷贝映射,适合对接旧代码

常用运算:写法自然,自动优化

加减乘除、转置、逆、行列式等都用直观操作符或成员函数,Eigen在编译期做表达式模板优化,多数运算不产生临时对象。

  • 基本运算C = A * B + A.transpose(); 一行完成,内部自动调度;A.array() * B.array() 表示逐元素乘(注意.array()
  • 分解与求解LLT chol(A); 做Cholesky分解;VectorXd x = chol.solve(b); 解Ax=b,比手写更稳更快
  • 特征值SelfAdjointEigenSolver eig(A); 仅适用于对称阵;eig.eigenvalues() 返回VectorXcd(复数)

性能与安全提醒

默认开启断言检查(如越界访问、维度不匹配),发布版可加-DNDEBUG关闭。真正影响速度的是内存布局和表达式惰性求值——别反复调用.eval(),除非需要强制计算。

  • 列优先存储(Fortran风格),遍历时优先用for (int j=0; j
  • 避免写A = A * B;(会触发别名问题),改用A.noalias() = A * B; 或直接A *= B;
  • 大矩阵建议用MatrixXf(float)省内存,精度够用时比double快不少

基本上就这些。Eigen不复杂但容易忽略细节,把矩阵类型选对、运算符用准,再配上合适的分解器,日常线性代数任务基本全覆盖。