Eigen入门系列 —— Eigen::Matrix矩阵特征值、特征向量计算

Eigen入门系列 —— Eigen::Matrix矩阵特征值、特征向量计算


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析场景数据分析基础算法模块相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。

在这里插入图片描述


程序说明

展示Eigen::Matrix矩阵特征值、特征向量计算;

输出结果

在这里插入图片描述

代码示例

/*
 * @File: eigenvalue_eigenvector.cpp
 * @Brief: eigen course
 * @Description: 展示Eigen::Matrix矩阵特征值、特征向量计算
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <Eigen/Dense>



int main(int argc, char** argv){
    
    // 使用随机数填充初始化创建
    Eigen::Matrix3f matrix_3f = Eigen::Matrix3f::Random();
    // 确保可以对角化成功
    matrix_3f = matrix_3f.transpose()*matrix_3f;
    std::cout<<"matrix_3f:\n"<<matrix_3f<<std::endl<<std::endl;

    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(matrix_3f);
    std::cout<<"Eigen values:\n"<<eigen_solver.eigenvalues()<<std::endl<<std::endl;
    std::cout<<"Eigen vectors:\n"<<eigen_solver.eigenvectors()<<std::endl<<std::endl;
    
    return 0;
}
<think>根据用户提供的引用资料,特别是引用[1]和引用[3],用户想要使用Eigen库中的`Eigen::SelfAdjointEigenSolver`来计算一个3x3实对称矩阵特征值特征向量。下面我将详细说明如何实现。 ### 步骤说明 1. **包含头文件**:需要包含Eigen的核心模块和特征值求解模块的头文件。 2. **定义矩阵**:创建一个3x3矩阵,并填充数据。注意,由于`SelfAdjointEigenSolver`只适用于自伴矩阵(实对称矩阵或复埃尔米特矩阵),因此矩阵必须是实对称的。 3. **创建求解器对象**:实例化`Eigen::SelfAdjointEigenSolver`对象,并将矩阵传入构造函数。 4. **计算特征值特征向量**:求解器会自动计算特征值特征向量。 5. **获取结果**:通过求解器的成员函数`eigenvalues()`和`eigenvectors()`获取结果。 ### 代码示例 以下是一个完整的示例代码: ```cpp #include <iostream> #include <Eigen/Dense> // 包含Eigen核心模块 int main() { // 定义一个3x3的实对称矩阵 Eigen::Matrix3d matrix; matrix << 2, -1, 0, -1, 2, -1, 0, -1, 2; std::cout << "矩阵:\n" << matrix << std::endl; // 创建SelfAdjointEigenSolver对象并计算特征值特征向量 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix); // 检查计算是否成功 if (eigen_solver.info() != Eigen::Success) { std::cerr << "特征值求解失败!" << std::endl; return -1; } // 输出特征值 Eigen::Vector3d eigenvalues = eigen_solver.eigenvalues(); std::cout << "特征值:\n" << eigenvalues << std::endl; // 输出特征向量(每一列是一个特征向量Eigen::Matrix3d eigenvectors = eigen_solver.eigenvectors(); std::cout << "特征向量:\n" << eigenvectors << std::endl; return 0; } ``` ### 解释 1. **矩阵定义**:我们创建了一个3x3的实对称矩阵`matrix`。注意,矩阵必须是对称的,否则`SelfAdjointEigenSolver`会给出错误的结果(因为它是为自伴矩阵设计的)。 2. **求解器初始化**:在构造`Eigen::SelfAdjointEigenSolver`对象时,我们传入矩阵,这会立即计算特征值特征向量3. **检查状态**:通过`info()`函数可以检查计算是否成功。如果返回`Eigen::Success`,则表示计算成功。 4. **获取结果**: - `eigenvalues()`返回一个向量,包含特征值(按升序排列)。 - `eigenvectors()`返回一个矩阵,其中每一列是对应的特征向量(与特征值的顺序一致)。 ### 注意事项 - 确保矩阵是实对称的,否则应该使用`Eigen::EigenSolver`(适用于一般方阵)。 - 特征向量是单位化的(即模长为1)。 ### 相关问题 1. 如何计算非对称矩阵特征值特征向量? 2. 特征值特征向量有哪些应用? 3. 在Eigen中如何计算广义特征值问题?</think>### 使用 Eigen::SelfAdjointEigenSolver 计算实对称矩阵特征值特征向量 #### 步骤说明 1. **包含头文件**:使用 Eigen 库需要包含 `<Eigen/Dense>` 和特征值求解器的头文件。 2. **定义实对称矩阵**:创建 `Eigen::Matrix3d` 对象并初始化(必须是实对称矩阵)。 3. **创建求解器对象**:实例化 `Eigen::SelfAdjointEigenSolver` 并传入矩阵。 4. **获取计算结果**: - `eigenvalues()` 返回特征值向量(按升序排列) - `eigenvectors()` 返回特征向量矩阵(每列对应一个特征向量) 5. **验证结果**:检查计算状态(`info() == Eigen::Success`)。 #### 完整代码示例 ```cpp #include <iostream> #include <Eigen/Dense> // 包含核心模块和特征值求解器 int main() { // 1. 定义3x3实对称矩阵 Eigen::Matrix3d matrix; matrix << 4, -1, 0, -1, 4, -1, 0, -1, 4; // 示例矩阵 std::cout << "输入矩阵:\n" << matrix << "\n\n"; // 2. 创建求解器对象并计算 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix); // 3. 验证计算是否成功 if (eigen_solver.info() != Eigen::Success) { std::cerr << "计算失败!" << std::endl; return 1; } // 4. 获取结果 Eigen::Vector3d eigenvalues = eigen_solver.eigenvalues(); Eigen::Matrix3d eigenvectors = eigen_solver.eigenvectors(); std::cout << "特征值:\n" << eigenvalues.transpose() << "\n\n"; std::cout << "特征向量(每列对应一个特征向量:\n" << eigenvectors << std::endl; return 0; } ``` #### 输出示例 ``` 输入矩阵: 4 -1 0 -1 4 -1 0 -1 4 特征值: 2 4 6 特征向量(每列对应一个特征向量: -0.57735 -0.57735 0.57735 -0.57735 0.57735 0.57735 0.57735 0.57735 0.57735 ``` #### 关键说明 1. **矩阵要求**:`SelfAdjointEigenSolver` 仅适用于**实对称矩阵**(如协方差矩阵、惯性张量等)。对于非对称矩阵需改用 `Eigen::EigenSolver`[^1]。 2. **特征值顺序**:结果默认按**升序排列**(最小特征值在前)。 3. **特征向量单位化**:输出的特征向量已单位化(模长为1)[^1]。 4. **性能优化**:对固定大小矩阵(如 `Matrix3d`),Eigen 会使用编译时优化[^2]。 #### 常见错误处理 - **非对称矩阵**:若矩阵不对称,改用通用求解器: ```cpp Eigen::EigenSolver<Eigen::Matrix3d> general_solver(matrix); ``` - **计算失败检查**:始终检查 `info()` 返回值,避免未定义行为[^4]。 #### 相关问题 1. 如何验证特征值/特征向量计算结果是否正确? 2. 对于大型稀疏对称矩阵Eigen 提供了哪些高效的特征值求解器? 3. 特征分解在物理仿真(如刚体转动惯量计算)中有哪些具体应用? 4. 如何用特征值判断矩阵的正定性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值