C++ Eigen常见的高级用法 [学习笔记]

Eigen 是一个功能强大的线性代数库,提供了丰富的高级用法和操作工具,涵盖矩阵运算、向量操作、分解方法、几何变换等多个领域。以下是常用的高级用法总结,分门别类以便查阅。


1. 矩阵与向量操作

1.1 矩阵的基本操作

cpp 复制代码
Eigen::MatrixXd matA(3, 3);
matA.setIdentity();          // 设置为单位矩阵
matA.setZero();              // 设置为零矩阵
matA.setOnes();              // 设置为全1矩阵
matA.transpose();            // 转置
matA.adjoint();              // 共轭转置
matA.inverse();              // 逆矩阵
matA.determinant();          // 行列式

1.2 块操作

cpp 复制代码
Eigen::MatrixXd matB(4, 4);
matB.block(1, 1, 2, 2) = Eigen::MatrixXd::Identity(2, 2); // 提取或赋值子矩阵
matB.topLeftCorner(2, 2);    // 提取左上角块
matB.bottomRightCorner(2, 2);// 提取右下角块
matB.row(0) = Eigen::RowVector4d(1, 2, 3, 4); // 操作特定行
matB.col(1) = Eigen::Vector4d(5, 6, 7, 8);    // 操作特定列

1.3 对角线与三角操作

cpp 复制代码
matA.diagonal() = Eigen::Vector3d(1, 2, 3); // 设置对角线
matA.triangularView<Eigen::Upper>();       // 提取上三角部分
matA.triangularView<Eigen::Lower>();       // 提取下三角部分

1.4 元素访问与操作

cpp 复制代码
double value = matA(0, 1);                  // 按索引访问元素
matA.array() += 1;                         // 将矩阵视为数组进行逐元素操作
matA = matA.unaryExpr([](double x) { return std::sqrt(x); }); // 对每个元素应用函数

2. 矩阵运算

2.1 基本矩阵运算

cpp 复制代码
Eigen::MatrixXd C = A + B;   // 矩阵加法
Eigen::MatrixXd D = A * B;   // 矩阵乘法
Eigen::MatrixXd E = A.cwiseProduct(B); // 按元素相乘
Eigen::MatrixXd F = A.cwiseQuotient(B); // 按元素相除

2.2 广播操作

cpp 复制代码
Eigen::MatrixXd G = A.rowwise() + Eigen::VectorXd::Ones(3).transpose(); // 每行加向量
Eigen::MatrixXd H = A.colwise() * Eigen::VectorXd::Constant(3, 2);     // 每列乘标量

3. 矩阵分解

3.1 特征值分解

cpp 复制代码
Eigen::EigenSolver<Eigen::MatrixXd> es(matA);
Eigen::VectorXd eigenvalues = es.eigenvalues().real(); // 提取特征值
Eigen::MatrixXd eigenvectors = es.eigenvectors().real(); // 提取特征向量

3.2 奇异值分解 (SVD)

cpp 复制代码
Eigen::JacobiSVD<Eigen::MatrixXd> svd(matA, Eigen::ComputeThinU | Eigen::ComputeThinV);
Eigen::MatrixXd U = svd.matrixU();
Eigen::MatrixXd V = svd.matrixV();
Eigen::VectorXd S = svd.singularValues(); // 奇异值

3.3 QR 分解

cpp 复制代码
Eigen::HouseholderQR<Eigen::MatrixXd> qr(matA);
Eigen::MatrixXd Q = qr.householderQ();
Eigen::MatrixXd R = qr.matrixQR().triangularView<Eigen::Upper>(); // 上三角矩阵

3.4 LU 分解

cpp 复制代码
Eigen::FullPivLU<Eigen::MatrixXd> lu(matA);
Eigen::MatrixXd L = lu.matrixLU().triangularView<Eigen::Lower>(); // 下三角
Eigen::MatrixXd U = lu.matrixLU().triangularView<Eigen::Upper>(); // 上三角

3.5 Cholesky 分解

适用于正定矩阵。

cpp 复制代码
Eigen::LLT<Eigen::MatrixXd> llt(matA);
Eigen::MatrixXd L = llt.matrixL(); // 下三角

4. 几何操作

4.1 基本类型

  • Eigen::Vector3d:三维向量
  • Eigen::Matrix3d:3x3 矩阵
  • Eigen::Quaterniond:四元数
  • Eigen::AngleAxisd:旋转轴-角度表示

4.2 旋转与变换

cpp 复制代码
Eigen::AngleAxisd rotation(M_PI / 4, Eigen::Vector3d::UnitZ()); // 绕 Z 轴旋转 45 度
Eigen::Matrix3d rotationMatrix = rotation.toRotationMatrix(); // 转换为旋转矩阵

Eigen::Quaterniond quat(rotation);  // 从旋转创建四元数
Eigen::Quaterniond quat2(1, 0, 0, 0); // 手动创建四元数
Eigen::Quaterniond result = quat * quat2; // 四元数相乘

Eigen::Vector3d point(1, 0, 0);
Eigen::Vector3d rotatedPoint = rotation * point; // 旋转向量

4.3 仿射变换

cpp 复制代码
Eigen::Affine3d transform = Eigen::Affine3d::Identity();
transform.translate(Eigen::Vector3d(1, 2, 3));    // 平移
transform.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d::UnitZ())); // 旋转
Eigen::Vector3d transformedPoint = transform * Eigen::Vector3d(1, 0, 0); // 应用变换

5. 稀疏矩阵操作

5.1 构造稀疏矩阵

cpp 复制代码
Eigen::SparseMatrix<double> sparseMat(4, 4);
sparseMat.insert(0, 1) = 3.14;   // 插入元素
sparseMat.coeffRef(2, 2) = 2.71; // 访问或修改元素
sparseMat.makeCompressed();      // 压缩存储

5.2 稀疏矩阵求解

cpp 复制代码
Eigen::SparseLU<Eigen::SparseMatrix<double>> solver;
solver.compute(sparseMat);
Eigen::VectorXd x = solver.solve(Eigen::VectorXd::Ones(4)); // 解线性方程

6. 其他常用功能

6.1 随机生成与初始化

cpp 复制代码
Eigen::MatrixXd randomMat = Eigen::MatrixXd::Random(3, 3); // 随机矩阵
Eigen::MatrixXd identityMat = Eigen::MatrixXd::Identity(3, 3); // 单位矩阵

6.2 条件判断与选择

cpp 复制代码
Eigen::MatrixXd filtered = matA.unaryExpr([](double val) { return val > 0 ? val : 0; }); // 逐元素条件筛选

6.3 显示矩阵信息

cpp 复制代码
std::cout << "Matrix A:\n" << matA << std::endl;

相关推荐
GlueNa2SiO313 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
「QT(C++)开发工程师」14 小时前
C++ 11 常用for循环
开发语言·c++
我还记得那天14 小时前
0 初识C++
开发语言·c++
Capricorn198815 小时前
解决全网抄 Karpathy 导致的 LLM Wiki 污染?基于知芽 Notebook Skill 的 raw/ 笔记法排障指南
大数据·论文阅读·人工智能·笔记·论文笔记
壹玖玖肆15 小时前
openGauss使用笔记
笔记
宵时待雨15 小时前
linux笔记归纳17:传输层协议UDP
linux·笔记·udp
「QT(C++)开发工程师」16 小时前
C++ std::move 详解
开发语言·c++
噜~噜~噜~17 小时前
操作系统笔记-2.3.2.1 进程互斥的软件实现方法
笔记·操作系统
小弥儿17 小时前
GitHub今日热榜 | 2026-08-26:AI 大脑与知识管理扎堆
人工智能·学习·开源·github