eigen个人笔记

// ref:http://eigen.tuxfamily.org/dox/GettingStarted.html
// 网上乱七八糟的参考太多了,绝大多数没什么意义,建议直接看ref的官方文档

**一、eigen定义**
Eigen::Matrix<double,3,3> m; //3*3 double矩阵
Eigen::Matrix<double,3,3,RowMajor>  // eigen在逻辑上是行主序,但是在内部存储是列主序,使用此方式改变存储方式(赋值的时候按按行赋值)
Eigen::Matrix<double, Dynamic, Dynamic, 0, 3, 4> // 可以设置为动态大小。如果想要控制最大尺寸,可以通过最后两个参数确定
**二、基础运算**
// eigen的同一个变量尽量不要同时在等式左侧和右侧,一旦两侧有变量重叠,就可能引发未知问题。这时候可以用eval解决,其是通过tmp来进行赋值
m.transpose()//转置  不能写 m = m.transpose()  可以用 m.transposeInPlace();或者m = m.transpose().eval()
m.conjugate()//共轭
m.adjoint()//伴随
m.dot(n)//点积
m.cross(n)//叉积 要求dim=3
m.sum() //所有元素求和
m.prod()//所有元素乘积
m.mean()//所有元素平均
m.trace()//迹
m.minCoeff()//所有元素最小值
m.maxCoeff()//所有元素最大值
**三、块操作**
m.block(i,j,p,q); // 从(i,j)开始取(p,q)大小的块。可赋值,可读取
m.block<p,q>(i,j);//同上   区别是上面是动态大小,这个是固定大小
m.col() m.row() ;//取某列某行
m.topLeftCorner(p,q);  m.topLeftCorner<p,q>(); //左上取(p,q)大小的块
m.bottomLeftCorner(p,q);  m.bottomLeftCorner<p,q>(); //左下取(p,q)大小的块
m.topRightCorner(p,q);  m.topRightCorner<p,q>(); //右上取(p,q)大小的块
m.bottomRightCorner(p,q);  m.bottomRightCorner<p,q>(); //右下取(p,q)大小的块
m.topRows(q);  m.topRows<q>(); //前q行
m.bottomRows(q);  m.bottomRows<q>(); 后q行
m.leftCols(p);  m.leftCols<p>(); //前q列
m.rightCols(q);  m.rightCols<q>(); //后q列
v.head<n>();  //向量前n个
v.tail<n>();  //向量后n个
v.segment<n>(i);   //向量从i开始一共n个
**四、初始化**
Eigen::Matrix<double,3,3> m //逗号初始化,只能在函数里面用
m << 1, 2, 3,
     4, 5, 6,
     789
Eigen::Matrix<double,3,3> m = Eigen::Matrix3d::Identity();//单位阵
Eigen::Matrix<double,3,3> m = Eigen::Matrix3d::Zero();//零
Eigen::Matrix<double,3,3> m = Eigen::Matrix3d::Random();//随机
(Eigen::Matrix<double,2,2> << 0, 1, 1, 0) * n   //临时对象
大矩阵一般用块操作进行赋值
**五、高级运算**
v.squaredNorm() //向量的2范数
v.norm()   //平方根
v.lpNorm<1>()   // lp范数
v.lpNorm<Infinity>() // lp-无穷范数
(m > 0).all() = 1 //矩阵中是否所有元素满足条件
(m > 0).any() = 1 //矩阵中是否存在元素满足条件
(m > 0).count() = 4 //矩阵中有多少元素满足条件
MatrixXf::Index maxRow, maxCol;
m.maxCoeff(&maxRow, &maxCol) //返回最大值,同时获取行列
MatrixXf::Index minRow, minCol;
m.minCoeff(&minRow, &minCol)
m.colwise().maxCoeff() // 返回向量,每列最大值   m.colwise()相当于对m的每列进行操作, m.colwise() +=v 广播机制
m.rowwise().maxCoeff() // 每行最大值
http://eigen.tuxfamily.org/dox/group__CoeffwiseMathFunctions.html
**六、Map类**
作用是将内存上的数组数据映射Eigen上 (可以认为是Eigen与double[][]的变换)
Eigen::Map<Eigen::Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime> > M( p)//p是一个指针
要知道M的类型,行,列,此外还要知道M的所指内存,如果前面Matrix是动态的那么就要用M(p,rows,columns)指定位置
double a[8] = {};
Eigen::Map<Eigen::Matrix<double, 8,1> > M(a)
使用中 M[4] 数值等于 a[4]  (浅拷贝)
**七、重塑&切片**
重塑利用Map类,读取现有矩阵
Map<MatrixXf> M2(m1.data(), 6,2);// 要注意Eigen是列主序
切片也用Map类
**八、vector+Eigen**
std::vector<Eigen::Vector4f, Eigen::aligned_allocator<Eigen::Vector4f >
**九、函数传递**
my_function(v);
void my_function(const Eigen::Vector2d& v);

剩下的矩阵分解运算并不常用,需要的时候查看ref就好。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值