文章目录
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> Matrix4ftypedef Matrix<float, 3, 1> Vector3f:列向量typedef Matrix<int, 1, 2> RowVector2i:行向量
动态矩阵和向量
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;此时只有一个X表示动态typedef Matrix<int, Dynamic, 1> VectorXiMatrix<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 firstIdxtolastIdxseq(2,5) <=> {2,3,4,5} seq(firstIdx,lastIdx,incr) same but using the increment incrto advance from one index to the nextseq(2,8,2) <=> {2,4,6,8} seqN(firstIdx,size) represents the sequence of sizeintegers starting fromfirstIdxseqN(2,5) <=> {2,3,4,5,6} seqN(firstIdx,size,incr) same but using the increment incrto advance from one index to the nextseqN(2,3,3) <=> {2,5,8} Intent Code Block-API equivalence Bottom-left corner starting at row iwithncolumnsA(seq(i,last), seqN(0,n)) A.bottomLeftCorner(A.rows()-i,n) Block starting at i,j havingmrows, andncolumnsA(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 nodd 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 nelements of vv(seq(last+1-n,last)) v.tail(n) -
条件筛选
没有直接的条件筛选,可以通过求最值坐标得方式实现
比较运算
ret = array>scale; ret2 = array<scale; ret2 and ret;
本文详细介绍了Eigen库中array、vector、tensor和matrix的使用,包括初始化、构造函数、内存映射、切片与索引等关键概念,并指出矩阵与常量的运算规则。



1万+

被折叠的 条评论
为什么被折叠?



