eigen:矩阵处理工具

上传人:F****n 文档编号:97818347 上传时间:2019-09-06 格式:DOCX 页数:25 大小:271.21KB
返回 下载 相关 举报
eigen:矩阵处理工具_第1页
第1页 / 共25页
eigen:矩阵处理工具_第2页
第2页 / 共25页
eigen:矩阵处理工具_第3页
第3页 / 共25页
eigen:矩阵处理工具_第4页
第4页 / 共25页
eigen:矩阵处理工具_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《eigen:矩阵处理工具》由会员分享,可在线阅读,更多相关《eigen:矩阵处理工具(25页珍藏版)》请在金锄头文库上搜索。

1、C+开源矩阵计算工具Eigen简单用法(一)矩阵转置函数m.transpose(); 矩阵的特征值m.eigenvalues();矩阵求逆矩阵m.inverse(); 特征向量m.eignvectors();1、 矩阵的定义Eigen中关于矩阵类的模板函数中,共有6个模板参数,但是目前常用的只有前三个,如下所示:cppview plaincopy1. template2. structtraitsMatrix3. .其前三个参数分别表示矩阵元素的类型,行数和列数。矩阵定义时可以使用Dynamic来表示矩阵的行列数为未知,例如:typedefMatrixMatrixXd;在Eigen中也提供了很

2、多常见的简化定义形式,例如:typedef Matrix Vector3d注意:(1)Eigen中无论是矩阵还是数组、向量,无论是静态矩阵还是动态矩阵都提供默认构造函数,也就是你定义这些数据结构时都可以不用提供任何参数,其大小均由运行时来确定。(2)矩阵的构造函数中只提供行列数、元素类型的构造参数,而不提供元素值的构造,对于比较小的、固定长度的向量提供初始化元素的定义,例如:cppview plaincopy1. Vector2da(5.0,6.0);2. Vector3db(5.0,6.0,7.0);3. Vector4dc(5.0,6.0,7.0,8.0);2、动态矩阵和静态矩阵动态矩阵是

3、指其大小在运行时确定,静态矩阵是指其大小在编译时确定,在Eigen中并未这样称呼矩阵。具体可见如下两段代码:代码段1:cppview plaincopy1. #include2. #include3. usingnamespaceEigen;4. usingnamespacestd;5. intmain()6. 7. MatrixXdm=MatrixXd:Random(3,3);8. m=(m+MatrixXd:Constant(3,3,1.2)*50;9. coutm=endlmendl;10. VectorXdv(3);11. v1,2,3;12. coutm*v=endlm*vendl;

4、13. 代码段2:cppview plaincopy1. #include2. #include3. usingnamespaceEigen;4. usingnamespacestd;5. intmain()6. 7. Matrix3dm=Matrix3d:Random();8. m=(m+Matrix3d:Constant(1.2)*50;9. coutm=endlmendl;10. Vector3dv(1,2,3);11. coutm*v=endlm*vendl;12. 说明:1)代码段1中MatrixXd表示任意大小的元素类型为double的矩阵变量,其大小只有在运行时被赋值之后才能知道

5、;MatrixXd:Random(3,3)表示产生一个元素类型为double的3*3的临时矩阵对象。2) 代码段2中Matrix3d表示元素类型为double大小为3*3的矩阵变量,其大小在编译时就知道;3)上例中向量的定义也是类似,不过这里的向量时列优先,在Eigen中行优先的矩阵会在其名字中包含有row,否则就是列优先。4)向量只是一个特殊的矩阵,其一个维度为1而已,如:typedef Matrix Vector3d3、矩阵元素的访问在矩阵的访问中,行索引总是作为第一个参数,需注意Eigen中遵循大家的习惯让矩阵、数组、向量的下标都是从0开始。矩阵元素的访问可以通过()操作符完成,例如m(

6、2,3)即是获取矩阵m的第2行第3列元素(注意行列数从0开始)。可参看如下代码:cppview plaincopy1. #include2. #include3. usingnamespaceEigen;4. intmain()5. 6. MatrixXdm(2,2);7. m(0,0)=3;8. m(1,0)=2.5;9. m(0,1)=-1;10. m(1,1)=m(1,0)+m(0,1);11. std:coutHereisthematrixm:nmstd:endl;12. VectorXdv(2);13. v(0)=4;14. v(1)=v(0)-1;15. std:coutHerei

7、sthevectorv:nvstd:endl;16. 其输出结果为:Here is the matrix m: 3 -12.5 1.5Here is the vector v:43针对向量还提供操作符,注意矩阵则不可如此使用,原因为:在C+中mi, j中逗号表达式 “i, j”的值始终都是“j”的值,即mi, j对于C+来讲就是mj;4、设置矩阵的元素在Eigen中重载了操作符,通过该操作符即可以一个一个元素的进行赋值,也可以一块一块的赋值。另外也可以使用下标进行复制,例如下面两段代码:代码段1cppview plaincopy1. Matrix3fm;2. m1,2,3,3. 4,5,6,4

8、. 7,8,9;5. std:coutm;输出结果为:1 2 34 5 67 8 9代码段二(使用下标进行复制)cppview plaincopy1. VectorXfm_Vector_A;2. MatrixXfm_matrix_B;3. intm_iN=-1;4. 5. boolInitData(intpSrc100100,intiWidth,intiHeight)6. 7. if(NULL=pSrc|iWidth=0|iHeight=0)8. returnfalse;9. m_iN=iWidth*iHeight;10. VectorXftmp_A(m_iN);11. MatrixXftmp

9、_B(m_iN,5);12. inti=0,j=0,iPos=0;13. while(iiWidth)14. 15. j=0;16. while(jiHeight)17. 18. tmp_A(iPos)=pSrcij*log(float)pSrcij);19. 20. tmp_B(iPos,0)=pSrcij;21. tmp_B(iPos,1)=pSrcij*i;22. tmp_B(iPos,2)=pSrcij*j;23. tmp_B(iPos,3)=pSrcij*i*i;24. tmp_B(iPos,4)=pSrcij*j*j;25. +iPos;26. +j;27. 28. +i;29.

10、30. m_Vector_A=tmp_A;31. m_matrix_B=tmp_B;32. 5、重置矩阵大小当前矩阵的行数、列数、大小可以通过rows(),cols()和size()来获取,对于动态矩阵可以通过resize()函数来动态修改矩阵的大小.需注意:(1)固定大小的矩阵是不能使用resize()来修改矩阵的大小;(2)resize()函数会析构掉原来的数据,因此调用resize()函数之后将不能保证元素的值不改变。(3) 使用“=”操作符操作动态矩阵时,如果左右边的矩阵大小不等,则左边的动态矩阵的大小会被修改为右边的大小。例如下面的代码段:cppview plaincopy1. Ma

11、trixXfa(2,2);2. std:coutaisofsizea.rows()xa.cols()std:endl;3. MatrixXfb(3,3);4. a=b;5. std:coutaisnowofsizea.rows()xa.cols()std:endl;输出结果为:a is of size 2x2a is now of size 3x36、如何选择动态矩阵和静态矩阵?Eigen对于这问题的答案是:对于小矩阵(一般大小小于16)的使用固定大小的静态矩阵,它可以带来比较高的效率,对于大矩阵(一般大小大于32)建议使用动态矩阵。还需特别注意的是:如果特别大的矩阵使用了固定大小的静态矩阵则可能造成栈溢出的问题本文主要是Eigen中矩阵和向量的算术运算,在Eigen中的这些算术运算重载了C+的+,-,*,所以使用起来非常方便。1、矩阵的运算Eigen提供+、-、一元操作符“-”、+=、-=,例如:二元操作符+/-表示两矩阵相加(矩阵中对应元素相加/减,返回一个临时矩阵): B+C 或B-C;一元操作符-表示对矩阵取负(矩阵中对应元素取负,返回一个临时矩阵):-C;组合操作法+=或者-=表示(对应每隔元素都做相应操作):A += B 或者 A-=B代码段1为矩阵的加减操作,代码如下:cppview plaincopy1. #includ

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号