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;

相关推荐
蒙奇·D·路飞-35 分钟前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
咸鱼翻身小阿橙1 小时前
现在这个四通道出现的问题
学习
小星星闪亮登场2 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
wgego2 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
梓䈑2 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
云贝教育-郑老师2 小时前
OceanBase 是如何搞定海量数据分片(Sharding)的?
学习·oceanbase·dba
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
编程圈子3 小时前
电机驱动开发学习23. 保护体系与故障状态机
驱动开发·学习
TunerT_TQ3 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海4 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github