// ref:http://eigen.tuxfamily.org/dox/GettingStarted.html
// 网上乱七八糟的参考太多了,绝大多数没什么意义,建议直接看ref的官方文档
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74**一、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个人笔记内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复