Eigen库

本文介绍了Eigen库的安装,包括Ubuntu的包管理和官网下载编译安装,并强调了内存对齐问题。在使用中,文章提醒注意矩阵的列存储、类型匹配和维数一致性。此外,还详细讨论了矩阵和向量的操作、SVD求解,以及Eigen与OpenCV、double*之间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

  • ubuntu 中:sudo apt-get install libeigen3-dev ,安装完成之后可以在/usr/include/下存在eigen3文件夹,证明安装成功。里面会有三个文件,子目录eigen3/Eigen下的头文件其实是对于你编译工程来说唯一需要的。

  • 如果上述方法不行(有的其他库依赖eigen版本不对),直接去官网下载对应版本即可,编译安装,cmake的时候可以指定安装路径(cmake … 之后最下面会有提示,根据提示重新cmake 一下,默认/usr/local/include)。

  • 查看使用的Eigen的版本:在/Eigen/src/Core/util/Macros.h 里面,比如3.2.92
    在这里插入图片描述

使用

注意坑
  1. 所有矩阵的默认按列存储,可以参考Matrix类,都是以0 为起点

  2. 所有操作需要相同类型,否则需要进行显示转化,也禁止弄错维数

  3. []限于vector, ()都可以,(index)取决于存储顺序

  4. 内存对齐问题


官方文档说明

  1. 总体介绍包括:各个模块的作用,各种矩阵、向量的类型,以及如何操作
    Chapters->Dense matrix and array manipulation(大部分普通操作都有) / ->Quick reference guide(Like cheatsheet)

在这里插入图片描述

  1. 查看typedef定义的常用的matrix和vector类型
    Chapters->Dense matrix and array manipulation->Reference->Global matrix typedefs

  2. 查看类的成员信息,.h文件
    Chapters->Dense matrix and array manipulation->Reference->每个module下有类的说明,最下面都有打开.h文件的快捷键,其他模块也在相应Reference下module里面。或者和Chapters同级目录下有Class List总的表,按首字母排序。


常用

矩阵和向量的操作

cols():行数
rows():列数
size():元素的个数
resize(3,3):重定义矩阵大小,和动态矩阵连用

    Eigen::MatrixXd R; // 刚开始可能不清楚定义多大的矩阵
    /*      操作得到行和列        */
    R.resize(1,9);
    R << 1,2,3,4,5,6,7,8,9;
    cout << R.rows()<< "  ";  // 1
    cout << R.cols()<< "  ";  // 9
    cout << R(0,2) << endl;  //3

    R.resize(3,3);
    cout << R.rows()<< "  "; // 3
    cout << R.cols() << "  "; // 3
    cout << R(2,2) << endl;  // 9


  • Eigen和matlab的操作对比
#include <Eigen/Dense>   
// 基本用法  
// Eigen          // Matlab           // 注释  
x.size()          // length(x)        // 向量的长度  
C.rows()          // size(C,1)        // 矩阵的行数  
C.cols()          // size(C,2)        // 矩阵的列数  
x(i)              // x(i+1)           // 访问向量元素(Matlab的下标从1开始计数)  
C(i,j)            // C(i+1,j+1)       // 访问矩阵元素  
    
A << 1, 2, 3,     // 初始化A,元素也可以是矩阵,先按列堆叠,再按行堆叠。  
     4, 5, 6,       
     7, 8, 9;       
B << A, A, A;     // B 是3个A水平排列  
A.fill(10);       // 将A的所有元素填充为10  
  
// Eigen                                    // Matlab                       注释  
MatrixXd::Identity(rows,cols)               // eye(rows,cols)               //单位矩阵  
C.setIdentity(rows,cols)                    // C = eye(rows,cols)           //单位矩阵  
MatrixXd::Zero(rows,cols)                   // zeros(rows,cols)             //全零矩阵  
C.setZero(rows,cols)                        // C = zeros(rows,cols)         //全零矩阵  
MatrixXd::Ones(rows,cols)                   // ones(rows,cols)              //全一矩阵  
C.setOnes(rows,cols)                        // C = ones(rows,cols)          //全一矩阵  
MatrixXd::Random(rows,cols)                 // rand(rows,cols)*2-1          //MatrixXd::Random 返回范围为(-1, 1)的均匀分布的随机数  
C.setRandom(rows,cols)                      // C = rand(rows,cols)*2-1      //返回范围为(-1, 1)的均匀分布的随机数  
VectorXd::LinSpaced(size,low,high)          // linspace(low,high,size)'     //返回size个等差数列,第一个数为low,最后一个数为high  
v.setLinSpaced(size,low,high)               // v = linspace(low,high,size)' //返回size个等差数列,第一个数为low,最后一个数为high  
VectorXi::LinSpaced(((hi-low)/step)+1,      // low:step:hi                  //以step为步长的等差数列。((hi-low)/step)+1为个数  
                    low,low+step*(size-1))  //  
  
  
// Matrix 切片和块。下面列出的所有表达式都是可读/写的。  
// 使用模板参数更快(如第2个)。注意:Matlab是的下标是从1开始的。  
// Eigen                           // Matlab                        // 注释  
x.head(n)          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值