概述
// 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,
7、8、9
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就好。
最后
以上就是迷人毛衣为你收集整理的eigen个人笔记的全部内容,希望文章能够帮你解决eigen个人笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复