Eigen 是一个功能强大的线性代数库,提供了丰富的高级用法和操作工具,涵盖矩阵运算、向量操作、分解方法、几何变换等多个领域。以下是常用的高级用法总结,分门别类以便查阅。
1. 矩阵与向量操作
1.1 矩阵的基本操作
Eigen::MatrixXd matA(3, 3);
matA.setIdentity(); // 设置为单位矩阵
matA.setZero(); // 设置为零矩阵
matA.setOnes(); // 设置为全1矩阵
matA.transpose(); // 转置
matA.adjoint(); // 共轭转置
matA.inverse(); // 逆矩阵
matA.determinant(); // 行列式
1.2 块操作
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 对角线与三角操作
matA.diagonal() = Eigen::Vector3d(1, 2, 3); // 设置对角线
matA.triangularView<Eigen::Upper>(); // 提取上三角部分
matA.triangularView<Eigen::Lower>(); // 提取下三角部分
1.4 元素访问与操作
double value = matA(0, 1); // 按索引访问元素
matA.array() += 1; // 将矩阵视为数组进行逐元素操作
matA = matA.unaryExpr([](double x) { return std::sqrt(x); }); // 对每个元素应用函数
2. 矩阵运算
2.1 基本矩阵运算
Eigen::MatrixXd C = A + B; // 矩阵加法
Eigen::MatrixXd D = A * B; // 矩阵乘法
Eigen::MatrixXd E = A.cwiseProduct(B); // 按元素相乘
Eigen::MatrixXd F = A.cwiseQuotient(B); // 按元素相除
2.2 广播操作
Eigen::MatrixXd G = A.rowwise() + Eigen::VectorXd::Ones(3).transpose(); // 每行加向量
Eigen::MatrixXd H = A.colwise() * Eigen::VectorXd::Constant(3, 2); // 每列乘标量
3. 矩阵分解
3.1 特征值分解
Eigen::EigenSolver<Eigen::MatrixXd> es(matA);
Eigen::VectorXd eigenvalues = es.eigenvalues().real(); // 提取特征值
Eigen::MatrixXd eigenvectors = es.eigenvectors().real(); // 提取特征向量
3.2 奇异值分解 (SVD)
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 分解
Eigen::HouseholderQR<Eigen::MatrixXd> qr(matA);
Eigen::MatrixXd Q = qr.householderQ();
Eigen::MatrixXd R = qr.matrixQR().triangularView<Eigen::Upper>(); // 上三角矩阵
3.4 LU 分解
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 分解
适用于正定矩阵。
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 旋转与变换
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 仿射变换
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 构造稀疏矩阵
Eigen::SparseMatrix<double> sparseMat(4, 4);
sparseMat.insert(0, 1) = 3.14; // 插入元素
sparseMat.coeffRef(2, 2) = 2.71; // 访问或修改元素
sparseMat.makeCompressed(); // 压缩存储
5.2 稀疏矩阵求解
Eigen::SparseLU<Eigen::SparseMatrix<double>> solver;
solver.compute(sparseMat);
Eigen::VectorXd x = solver.solve(Eigen::VectorXd::Ones(4)); // 解线性方程
6. 其他常用功能
6.1 随机生成与初始化
Eigen::MatrixXd randomMat = Eigen::MatrixXd::Random(3, 3); // 随机矩阵
Eigen::MatrixXd identityMat = Eigen::MatrixXd::Identity(3, 3); // 单位矩阵
6.2 条件判断与选择
Eigen::MatrixXd filtered = matA.unaryExpr([](double val) { return val > 0 ? val : 0; }); // 逐元素条件筛选
6.3 显示矩阵信息
std::cout << "Matrix A:\n" << matA << std::endl;