在C++中进行矩阵运算时,手动实现矩阵类和相关运算逻辑会消耗大量时间,还容易出现边界错误、性能问题。Eigen库作为开源的线性代数库,仅需包含头文件即可使用,支持稠密矩阵和稀疏矩阵运算,涵盖了大部分常用线性代数操作,是C++中处理矩阵运算的常用选择。

Eigen库环境配置
Eigen库是纯头文件库,不需要编译安装,只需要把下载的Eigen源码文件夹放到项目包含目录中,在代码中通过#include <Eigen/Dense>即可引入所有稠密矩阵相关功能。如果是使用CMake构建项目,可以通过find_package(Eigen3 REQUIRED)指令查找库,再通过target_link_libraries(项目名 Eigen3::Eigen)关联依赖。
矩阵定义与初始化
Eigen中矩阵类型通过Eigen::Matrix<数据类型, 行数, 列数>模板定义,动态大小的矩阵可以用Eigen::MatrixXd(双精度动态矩阵)、Eigen::MatrixXi(整型动态矩阵)等别名。下面是矩阵初始化的示例代码:
#include <iostream>
#include <Eigen/Dense>
int main() {
// 定义2行3列的静态双精度矩阵
Eigen::Matrix<double, 2, 3> mat1;
// 使用逗号初始化赋值
mat1 << 1.0, 2.0, 3.0,
4.0, 5.0, 6.0;
std::cout << "静态矩阵mat1内容:" << std::endl;
std::cout << mat1 << std::endl;
// 定义3行2列的动态双精度矩阵
Eigen::MatrixXd mat2(3, 2);
mat2 << 1.0, 2.0,
3.0, 4.0,
5.0, 6.0;
std::cout << "动态矩阵mat2内容:" << std::endl;
std::cout << mat2 << std::endl;
return 0;
}
基础矩阵运算
Eigen重载了大部分运算符,矩阵加减、数乘、乘法都可以直接用运算符完成,下面是常见运算的示例:
#include <iostream>
#include <Eigen/Dense>
int main() {
Eigen::Matrix2d a;
a << 1, 2,
3, 4;
Eigen::Matrix2d b;
b << 5, 6,
7, 8;
// 矩阵加法
Eigen::Matrix2d addResult = a + b;
std::cout << "a + b结果:" << std::endl;
std::cout << addResult << std::endl;
// 矩阵减法
Eigen::Matrix2d subResult = a - b;
std::cout << "a - b结果:" << std::endl;
std::cout << subResult << std::endl;
// 矩阵数乘
Eigen::Matrix2d mulNumResult = a * 2.0;
std::cout << "a * 2结果:" << std::endl;
std::cout << mulNumResult << std::endl;
// 矩阵乘法
Eigen::Matrix2d mulMatResult = a * b;
std::cout << "a * b结果:" << std::endl;
std::cout << mulMatResult << std::endl;
return 0;
}
常用矩阵操作
Eigen还提供了转置、求逆、求迹、求特征值等常用操作,下面是相关示例:
#include <iostream>
#include <Eigen/Dense>
int main() {
Eigen::Matrix2d mat;
mat << 1, 2,
3, 4;
// 矩阵转置
Eigen::Matrix2d transposeMat = mat.transpose();
std::cout << "矩阵转置结果:" << std::endl;
std::cout << transposeMat << std::endl;
// 矩阵求逆
Eigen::Matrix2d inverseMat = mat.inverse();
std::cout << "矩阵求逆结果:" << std::endl;
std::cout << inverseMat << std::endl;
// 矩阵求迹(对角线元素之和)
double traceVal = mat.trace();
std::cout << "矩阵迹为:" << traceVal << std::endl;
// 求矩阵特征值
Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> solver(mat);
if (solver.info() == Eigen::Success) {
std::cout << "矩阵特征值:" << std::endl;
std::cout << solver.eigenvalues() << std::endl;
}
return 0;
}
注意事项
- 进行矩阵乘法时,要确认前一个矩阵的列数等于后一个矩阵的行数,否则会编译报错或者运行结果异常。
- 动态大小矩阵在定义时需要指定行数和列数,静态大小矩阵在模板参数中已经固定了维度,不需要额外指定。
- 如果需要频繁进行矩阵运算,尽量使用固定大小的矩阵类型,性能会比动态大小矩阵更好。
- 矩阵转置操作
transpose()返回的是转置的临时对象,如果需要修改原矩阵,要使用mat.transposeInPlace()方法。