安装
-
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
使用
注意坑
- 主要参考官方说明文档
-
所有矩阵的默认按列存储,可以参考Matrix类,都是以0 为起点。
-
所有操作需要相同类型,否则需要进行显示转化,也禁止弄错维数
-
[]限于vector, ()都可以,(index)取决于存储顺序
官方文档说明
- 总体介绍包括:各个模块的作用,各种矩阵、向量的类型,以及如何操作:
Chapters->Dense matrix and array manipulation(大部分普通操作都有) / ->Quick reference guide(Like cheatsheet)
-
查看typedef定义的常用的matrix和vector类型:
Chapters->Dense matrix and array manipulation->Reference->Global matrix typedefs -
查看类的成员信息,.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)