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;

相关推荐
OTWOL6 分钟前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
Somnus陳17 分钟前
软考架构师笔记-计算机系统组成-1
笔记·系统架构
QQ同步助手23 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
qq_4335545433 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
易码智能41 分钟前
【EtherCATBasics】- KRTS C++示例精讲(2)
开发语言·c++·kithara·windows 实时套件·krts
ཌ斌赋ད1 小时前
FFTW基本概念与安装使用
c++
薄荷故人_1 小时前
从零开始的C++之旅——红黑树封装map_set
c++
LuH11242 小时前
【论文阅读笔记】IC-Light
论文阅读·笔记
汤姆和佩琦2 小时前
2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
学习·聚类·sklearn
是小菜呀!2 小时前
实验四 触发器
笔记