C++_Eigen库的使用

C++_Eigen库的使用

介绍

Eigen是一个C++开源线性代数库。它提供了快速的有关矩阵的线性代数运算和解方程等功能。许多上层的软件库也使用Eigen进行矩阵运算,包括g2o、Sophus等.

下载

https://eigen.tuxfamily.org/index.php?title=Main_Page

image-20231213155052410

windows下载zip后,进行解压缩

配置

CMakeList.txt配置

include_directories(D:\\C++_CLion\\SLAM_Test\\eigen)

填写解压路径

使用

#include "iostream"
#include <ctime>
// 稠密矩阵的代数运算(逆、特征值)
#include <Eigen/Dense>
#include <Eigen/Core>

#define MATRTX_SIZE 50

using namespace std;

int main(int argc, char **argv) {
    //声明一个2x3的float矩阵
    Eigen::Matrix<float, 2, 3> matrix_23;
    //Vector3d实质上是Eigen::Matrix<double, 3, 1>
    Eigen::Vector3d v_3d;
    //Vector3d实质上是Eigen::Matrix<double, 3, 3>
    Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();

    //不确定矩阵大小,可以使用动态矩阵
    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;
    //或者
    Eigen::MatrixXd matrix_x;

    //矩阵输入操作
    matrix_23 << 1, 2, 3, 4, 5, 6;
    //输出
    cout << matrix_23 << endl;
    //类型
    cout << typeid(matrix_23).name() << endl;
    //访问矩阵中的元素
    for (int i = 0; i < 1; i++)
        for (int j = 0; j < 2; j++)
            cout << matrix_23(i, j) << endl;
    v_3d << 3, 2, 1;
    //矩阵和向量相乘, 不能混合两种不同类型的矩阵
    //Eigen::Matrix<double, 2, 1> result_wrong = matrix_23 * v_3d;
    Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;

    //矩阵运算
    matrix_33 = Eigen::Matrix3d::Random();
    cout << matrix_33 << endl << endl;
    cout << matrix_33.transpose() << endl; // 转置
    cout << matrix_33.trace() << endl; // 迹
    cout << 10 * matrix_33 << endl; // 数乘
    cout << matrix_33.inverse() << endl; // 逆
    cout << matrix_33.determinant() << endl; // 行列式

    //特征值
    //实对称矩阵可以保证对角化成功
    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
    cout << "Eigen values = " << eigen_solver.eigenvalues() << endl;
    cout << "Eigen vectors = " << eigen_solver.eigenvectors() << endl;

    //解方程
    //求解 matrix_NN * x = v_Nd
    //N大小为宏定义 矩阵由随机数生成
    Eigen::Matrix<double, MATRTX_SIZE, MATRTX_SIZE> matrix_NN;
    matrix_NN = Eigen::MatrixXd::Random(MATRTX_SIZE, MATRTX_SIZE);
    Eigen::Matrix<double, MATRTX_SIZE, 1> v_Nd;
    v_Nd = Eigen::MatrixXd::Random(MATRTX_SIZE, 1);
    clock_t time_start = clock(); //计时
    //直接求逆
    Eigen::Matrix<double, MATRTX_SIZE, 1> x = matrix_NN.inverse() * v_Nd;
    cout << "time use in normal inverse is " << 1000 * (clock() - time_start)/(double) CLOCKS_PER_SEC << "ms" << endl;

    //通常用矩阵分解求解 QR分解
    time_start = clock();
    x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
    cout << "time use in normal inverse is " << 1000 * (clock() - time_start)/(double) CLOCKS_PER_SEC << "ms" << endl;

    return 0;
}

1 2 3
4 5 6
N5Eigen6MatrixIfLi2ELi3ELi0ELi2ELi3EEE
1
2
 -0.997497   0.617481  -0.299417
  0.127171   0.170019   0.791925
 -0.613392 -0.0402539    0.64568

 -0.997497   0.127171  -0.613392
  0.617481   0.170019 -0.0402539
 -0.299417   0.791925    0.64568
-0.181799
 -9.97497   6.17481  -2.99417
  1.27171   1.70019   7.91925
 -6.13392 -0.402539    6.4568
-0.271556    0.7412  -1.03501
  1.08862   1.58676  -1.44134
-0.190108  0.803059  0.475647
-0.521644
Eigen values = 0.145004
   1.136
 1.65193
Eigen vectors =  0.415633 0.0900561 -0.905063
 0.906947 0.0339438  0.419875
0.0685336 -0.995358 -0.067568
time use in normal inverse is 2ms
time use in normal inverse is 2ms

进程已结束,退出代码0

来源—《视觉SLAM十四讲从理论到实践》

Eigen是一个用于线性代数和数值计算的C++模板。它提供了各种矩阵和向量操作的高性能实现。Eigen可以与Qt和CMake一起使用。 为了在Qt项目中使用Eigen,你需要在CMake中添加Eigen的依赖。在CMakeLists.txt文件中,你可以通过添加以下代码来指定Eigen的路径: ``` find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) ``` 这将帮助CMake找到Eigen包,并将其包含在项目中。 对于CMake的配置,你可以按照以下步骤进行操作: 1. 在CMake中设置源代码目录为你下载的Eigen文件夹(比如C:\eigen3.2.8)。 2. 设置构建目录为Eigen目录下的build文件夹(比如C:\eigen3.2.8\build)。请确保你已经在该目录下创建了build文件夹。 3. 使用上述代码片段在CMakeLists.txt文件中添加Eigen的依赖。 4. 运行CMake生成项目文件。 在运行CMake之前,你可以根据需要设置其他CMake选项。例如,你可以使用`-DCMAKE_INSTALL_PREFIX`选项指定安装路径,以便在安装时将Eigen安装到你想要的位置。 最后,通过运行以下命令来构建和安装项目: ``` make make install ``` 这样,你就可以轻松地在Qt项目中使用Eigen,并且可以通过更改CMake配置来切换不同版本的Eigen。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Eigen多版本安装以及cmake包含使用](https://blog.csdn.net/qq_43526137/article/details/125742642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [VS2013+QT+OPENGL+Eigen+Cmake配置方法](https://blog.csdn.net/caozenghuan/article/details/78430132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值