文章目录
eigen 使用梳理与记录
eigen 官方文档
https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html
https://www.codenong.com/cs105391280/
array和vector、 tensor、 martix 的说明
vector tensor martix
:其中 vector tensor martirx 的运算执行矩阵的规则,线性代数运算.即矩阵的加减以及数乘,在这几个类别中,矩阵与常量的加法是不被允许的
array
:
eigen 初始化
- 用一维vetor 初始化
数据类型
静态矩阵和向量
typedef Matrix<float, 4, 4> Matrix4f
typedef Matrix<float, 3, 1> Vector3f
:列向量typedef Matrix<int, 1, 2> RowVector2i
:行向量
动态矩阵和向量
typedef Matrix<double, Dynamic, Dynamic> MatrixXd
;此时只有一个X
表示动态typedef Matrix<int, Dynamic, 1> VectorXi
Matrix<float, 3, Dynamic>
特殊类型Array
Type | Typedef | |
---|---|---|
Array<float,Dynamic,1> | ArrayXf | |
Array<float,3,1> | Array3f | |
Array<double,Dynamic,Dynamic> | ArrayXXd | 与Matrix 不同 |
Array<double,3,3> | Array33d | 必须是ArrayNNt 类型 |
补充说明
ArrayXXd df(9,1) <==> ArrayXd df(9,1)
类型转换
max.cast<type>()
构造函数,初始化
-
矩阵初始化:
Matrix3f a
;MatrixXf b
;MatrixXf a(10,15)
;VectorXf b(30)
;
-
赋值方法
eigen 默认的存储方式是列优先,
typedef Matrix<double, Dynamic, Dynamic,RowMajor>rMatrixXd;//定义矩阵行优
-
确定矩阵,使用索引赋值
MatrixXd m(2,2); m(0,0) = 3; m(1,0) = 2.5; m(0,1) = -1;
-
使用
<<
,此时矩阵的形状必须确定Matrix3d m; m << 1,2,3, 4,5,6, 7,8,9; cout << m << endl;
-
大小不确定矩阵,如
MatrixXd waypoints_;VectorXd timepoints_;
赋值前使用resize;否则会出现如下错误:./eigen/Eigen/src/Core/CommaInitializer.h:36: Eigen::CommaInitializer<MatrixType>::CommaInitializer(XprType&, const Scalar&) [with XprType = Eigen::Matrix<float, -1, -1>; Eigen::CommaInitializer<MatrixType>::Scalar = float]: Assertion `m_xpr.rows() > 0 && m_xpr.cols() > 0 && "Cannot comma-initialize a 0x0 matrix (operator<<)"' failed.
-
-
取值
max(i,j)
内存映射map
-
vector 转 eigen类型
不同类型的结构数据存储结构之间进行内存映射,例如,把opencv 的mat 转换为eigen 的 matrix, 或者std::vector 填入matrix。可以在不进行拷贝的情况下进行使用eigen 的map 功能内存映射。
例如:
int array[9]; Eigen::Map<MatrixXi> mat(array,3,3); //Map <类型> 变量名(地址,形状) //高维矩阵 Eigen::TensorMap<
-
eigen 转vector,利用地址映射
Eigen::VectorXd p{1,2,3}; std::vector<double>arg(&p[0], p.data()+p.cols()*p.rows());
切片和索引
-
矩阵的块操作
matrix.block(i,j,p,q); //(1) matrix.block<p,q>(i,j); //(2)
定义(1) 表示返回从矩阵的
(i,j)
开始,每行取p
个元素,每列取q
个元素;返回新的临时矩阵,原矩阵元素不变。定义(2)和(1)结果一样,可理解为获取一个p行,q列的子矩阵,起始位置从
(i,j)
开始。通过上述方式获取的子矩阵可以作为左值(也就是给该对象赋值),也可以作为右值(用该矩阵给其他矩阵赋值)
-
向量的块操作
获取向量的前n个元素:vector.head(n);
获取向量尾部的n个元素:vector.tail(n);
获取从向量的第i个元素开始的n个元素:vector.segment(i,n);
-
索引
function description example seq(firstIdx,lastIdx) represents the sequence of integers ranging from firstIdx
tolastIdx
seq(2,5) <=> {2,3,4,5} seq(firstIdx,lastIdx,incr) same but using the increment incr
to advance from one index to the nextseq(2,8,2) <=> {2,4,6,8} seqN(firstIdx,size) represents the sequence of size
integers starting fromfirstIdx
seqN(2,5) <=> {2,3,4,5,6} seqN(firstIdx,size,incr) same but using the increment incr
to advance from one index to the nextseqN(2,3,3) <=> {2,5,8} Intent Code Block-API equivalence Bottom-left corner starting at row i
withn
columnsA(seq(i,last), seqN(0,n)) A.bottomLeftCorner(A.rows()-i,n) Block starting at i
,j havingm
rows, andn
columnsA(seqN(i,m), seqN(i,n)) A.block(i,j,m,n) Block starting at i0
,j0 and ending ati1
,j1A(seq(i0,i1), seq(j0,j1) A.block(i0,j0,i1-i0+1,j1-j0+1) Even columns of A A(all, seq(0,last,2)) First n
odd rows AA(seqN(1,n,2), all) The last past one column A(all, last-1) A.col(A.cols()-2) The middle row A(last/2,all) A.row((A.rows()-1)/2) Last elements of v starting at i v(seq(i,last)) v.tail(v.size()-i) Last n
elements of vv(seq(last+1-n,last)) v.tail(n) -
条件筛选
没有直接的条件筛选,可以通过求最值坐标得方式实现
比较运算
ret = array>scale; ret2 = array<scale; ret2 and ret;