




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+矩阵处理库-Eigen初步使用(转载自:CSDNcyxcwl的博客)2013-07-1621:20:43|分类:计算机视觉|举报|字号订阅项目要进行比较多的矩阵操作,特别是二维矩阵。刚开始做实验时,使用了动态二维数组,于是写了一堆Matrix函数,作矩阵的乘除加减求逆求行列式。实验做完了,开始做代码优化,发现Matrix.h文件里适用性太低,而且动态二维数组的空间分配与释放也影响效率,于是寻找其他解决方案。首先考虑的是与Matlab混合编程,折腾了半天把Matlab环境与VS2010环境之后,发现Matlab编译出来的函数使用起来也比较麻烦,要把数组转化成该函数适用的类型后才能使用这些函数
2、。我的二维数组也不是上千万维的,估计这个转化的功夫就牺牲了一部分效率了。(如果谁有混合编程的心得,求帮忙,冏。)接着想到使用一维数组的方法,或者把一维数组封装在一个类里边。想着又要写一堆矩阵操作函数头就大,索性谷歌了一下矩阵处理库,除了自己之前知道的OpenCV库(之前由于转化cvarr麻烦,于是放弃),还有Eigen,Armadillo。http:效率做了一个简单的评测,OpenCV库的矩阵操作效率是最低的,还好我没使用。Eigen速度最快,与自己定义数组的操作效率相当(-,才相当吗?我本来还想找个更快的呢)。于是选择使用Eigen。进入正题。安装:http:eigen.tuxfamily.
3、org/index.php?title=Main_Page这里杲官网,直接把包下载下来,不大,也就几M,我是直接放在自己项目文件夹(考虑项目封装时,这样比较方便),放在VS2010<INCLUDE>文件夹。简单使用:看了一下官方文档,Eigen库除了能实现各种矩阵操作外,貌似还提供数学分析中的各种矩阵操作(包括L矩阵U矩阵)。目前我使用到的还是简单的矩阵操作,如加减乘除,求行列式,转置,逆,这些基本操作只要:cppviewplaincopyprint?1. #include"Eigen/Eigen"2. usingnamespaceEigen;就能实现,别忘了名
4、空间Eigen。包含的类型:MatricesArraysArray<float,Dynamic,Dynamic><=>ArrayXXfArray<double,Dynamic,1><=>ArrayXdArray<int,1,Dynamic><=>RowArrayXiArray<float,3,3><=>Array33fArray<float,4,1><=>Array4fMatrix<float,Dynamic,Dynamic><=>MatrixXfMa
5、trix<double,Dynamic,1><=>VectorXdMatrix<int,1,Dynamic><=>RowVectorXiMatrix<float,3,3><=>Matrix3fMatrix<float,4,1><=>Vector4f如上表,主要包括两种类型,Matrices与Arryays,接着是这两种类型的派生类型。现在我用到的是Matrices(我不明白这两种类型在效率间有什么差距,冏。),其中Matrix代表二维矩阵,Vector代表列向量RowVector代表行向量。如果后面
6、跟着X,则代表是动态的数组,运行时可以根据需求改变,如果是数字,则代表是静态的(根据实验,最多能建立4维的静态矩阵或者数组,-,为嘛不是6维,实验正好需要)。i代表int类型,f代表float类型,d代表double。对应关系:Matrix二维矩阵Vector列向量RowVector行向量X动态固定数字n静态,4>=n>=1iintffloatddoubleArrays类型的话也跟Matrices差不多。基本操作,定义,初始化,矩阵操作:cppviewplaincopyprint?1. #include<iostream>2. #include"Eigen/E
7、igen”3. usingnamespacestd;4. usingnamespaceEigen;5.6. voidfoo(MatrixXf&m)7. 8. Matrix3fm2=Matrix3f:Zero(3,3);9. m2(0,0)=1;10. m=m2;11. 12. intmain()13. 14. /*定义,定义时默认没有初始化,必须自己初始化*/15. MatrixXfm1(3,4);/动态矩阵,建立3行4歹限16. MatrixXfm2(4,3);/4行3列,依此类推。17. MatrixXfm3(3,3);18. Vector3fv1;/若是静态数组,则不用指定行或者
8、列19. /*初始化*/20. m1=MatrixXf:Zero(3,4);/用0矩阵初始化,要指定行列数21. m2=MatrixXf:Zero(4,3);22. m3=MatrixXf:Identity(3,3);/用单位矩阵初始化23. v1=Vector3f:Zero();/同理,若是静态的,不用指定行列数24.25. m1<<1,0,0,1,也可以以这种方式初始化26. 1,5,0,1,28. m2<<1,0,0,29. 0,4,0,30. 0,0,7,31. 1,1,1;32.33. /*元素的访问*/34. v11=1;35. m3(2,2)=7;36.
9、cout<<"v1:n"<<v1<<endl;37. cout<<"m3:n"<<m3<<endl;38. /*复制操作*/39. VectorXfv2=v1;/复制后,行数与列数和右边的v1相等,matrix也是一样,40. /也可以通过这种方式重置动态数组的行数与列数41. cout<<"v2:n"<<v2<<endl;42.43. /*矩阵操作,可以实现+-*/操作,同样可以实现连续操作(但是维数必须符合情况),44. 如
10、m1,m2,m3维数相同,则可以m1=m2+m3+m1;*/45. m3=m1*m2;46. v2+=v1;47. cout<<"m3:n"<<m3<<endl;48. cout<<"v2:n"<<v2<<endl;49. /m3=m3.transpose();这句出现错误,估计不能给自己赋值50. cout<<"m3转置:n"<<m3.transpose()<<endl;51. cout<<"m3行歹!J
11、式:n"<<m3.determinant()<<endl;52. m3=m3.reverse();53. cout<<"m3求逆:n"<<m3<<endl;54.55. system("pause");56.57. return0;58. 输出:htmlviewplaincopyprint?1. v1:2. 03. 14. 05. m3:6. 1007. 0108. 0079. v2:10. 011. 112. 013. m3:14. 21115. 221116. 116417. v2
12、:18. 019. 220. 021. m3转置:22. 22123. 121124. 116425. m3行列式:26. 254027. m3求逆:28. 641129. 1211基本的操作就是以上这些,有了这个库,以后就不用做重复工作了!C+矩阵处理工具Eigen分类:C/C+MATLABLinux&MAC2012-07-2420:3718047人阅读评论(32)收藏举报工具c+matrixrandominitializationmatlab最近和一些朋友讨论到了C+中数学工具的问题,以前总是很2地自己写矩阵运算,或者有时候在matlab里计算了一些数据再往C程序里倒,唉想想那些年
13、,我们白写的代码啊人家早已封装好了!首先推荐几个可以在C+中调用的数学平台:eigen、bias、lapack、svd、CMatrix,本文着重eigen做以讲解,希望对各位有所帮助。下面是本文主线,主要围绕下面几点进行讲解:*Eigen是什么?Eigen3哪里下载?Eigen3的配置Eigen3样例代码有没有?去哪里更深入学习?*Eigen是什么?Eigen是C+中可以用来调用并进行矩阵计算的一个库,里面封装了一些类,需要的头文件和功能如下:ModulesandHeaderfilesTheEigenhbraryisdividedinaCoremoduleandseveraladdibonal
14、modules.Eachmodulehasacorrespondingheaderfilewhichhastobeincludedinordertousethemodule.TheJenieandEigenheadefriesare口OMidedt。convenientlygainaccesstoseveralmodulesatonce.ModuleCoreGeometryLUChoieskYHouseholderSVDQREigenvaluesSparseHeaderfileContentsii.,i,巴MatrixandArrayd日兆守的b己witline己1ralgebra(inclu
15、dingtrimngulwandseifadjcintproducts)rarraymanipulation机处配立LGTranstormTranslation,叼行呷ftotion2Dand3Drotations(Quaternion,AngleAxis)#LILcluda&ssn/Lu>Inverse,determinant,LUdecompositronswithsolvern-(FullPivLUPartialPivLU)板足通LLTandLDLTCh。悟skyfactorationwithsolver粒EM<Ei/n/iUxhoi&QHouseholder
16、transformations;thismoduleisusedbysevelinearalgebramodules於neiud电<EigMi/svn>5V口decompositionwithleast-squaressolverCJacobiSVD)机X”心<E1e6n/0B>QRdcomposihonwithsolver(HouseholderQR,ColPiuHou&eficlderQRrFuHPivHouseholdsrQk)# 皿I2®鸵Eigenvalue,eigenvertordecomposrtionsCEigenSolverSeifA
17、ojotntEigenS-olverComplexEig&nSolver)# LIlciudt侬*n/班虹GS口日强matrixstoogeandrelatedbareg北日(Spiir5eNntnx,DvnamkSDarseMatrix/Spar5eVector)# Uclude®即n/mnsGdeludesUdgGam改MLUChomsky,QRantiEigenvaiuesheaderfiles版iLuiude<Ei中南上:变QIncludesDenseandSparseheaderfiles(thewholeEigenlibrary)Eigen的主页上有一些更详
18、细的日gen介绍。Eigen3哪里下载?这里是我下好的,这里是官网主页,请自行下载,是个code包,不用安装。Eigen的配置逋用属性一直置晨性簟规jC/C+嬴京姓理器代隹生成逅言七要泽头批出文件窗疑信息高级清单工具XML立档生成号湖显信息讯刍定父生成声要配置浩朗(Mbug)-平白网活副CWin算配意附加包含目录D:PragramFilecXcigenS解析仙Jng弓|用调近信息惜式用于“编铜井彼续”的程序激据库(/ZD酬香盘不启动版校标志是t/rtolog&)警告箸盟3圾(/W3J检源64拉可移植性问嶷舌将警与艮为错送香慢吊UNICODEm立交1牛皇附加包含目录指是f或寥个登添加至唯
19、序窗佞由的目录;号目录不止一W,请用分号分隔.I直接上图了,附加包含目录那里填上你放日gen文件夹的位置即可。Eigen的样例代码有没有?当然有,这篇文章重点就是这里!以下是我整理的一些常用操作,基本的矩阵运算就在下面了,算是个入门吧主要分以下几部分:建议大家放到编译环境里去看,因为我这里有一些region的东西,编译器下更方便看cppviewplaincopy1. #include<iostream>2. #include<Eigen/Dense>3.4./usingEigen:MatrixXd;5.usingnamespaceEigen;6.usingnamespa
20、ceEigen:internal;7.8.usingnamespaceEigen:Architecture;9.10.usingnamespacestd;11.12. intmain()13. 14.15. #pragmaregionone_d_object2.23.24.cout<<II*1D-objectVector4dv1;v1<<1,2,3,4;cout<<"v1=n"<<v1<<endl;VectorXdv2(3);v2<<1,2,3;*“<<
21、endl;25. cout<<"v2=n"<<v2<<endl;26.27. Array4iv3;28. v3<<1,2,3,4;29. cout<<"v3=n"<<v3<<endl;30.31. ArrayXfv4(3);32. v4<<1,2,3;33. cout<<"v4=n"<<v4<<endl;34.35. #pragmaendregion36.37. #pragmaregiontwo_d_ob
22、ject1.42.43.cout<<II*/2Dobjects:MatrixXdm(2,2);/method1*2D-object*“<<endl;44. m(0,0)=3;45. m(1,0)=2.5;46. m(0,1)=-1;47. m(1,1)=m(1,0)+m(0,1);48.49. /method250. m<<3,-1,51. 2.5,-1.5;52. cout<<"m=n"<<m<<endl;54. #pragmaendregion55.56. #pragmaregi
23、onComma_initializer57.58. cout<<59.60. int61. int“*Initialization*"rows=5;cols=5;<<endl;62. MatrixXfm1(rows,cols);63. m1<<(Matrix3f()<<1,2,3,4,5,6,7,8,9).finished(),64. MatrixXf:Zero(3,cols-3),65. MatrixXf:Zero(rows-3,3),66. MatrixXf:Identity(rows-3,cols-3);67. cout<&
24、lt;"m1=n"<<m1<<endl;69.#pragmaendregion70.71. #pragmaregionRuntime_info72.73.cout<<II*RuntimeInfo*“<<endl;74.75. MatrixXfm2(5,4);76. m2<<MatrixXf:Identity(5,4);77. cout<<"m2=n"<<m2<<endl;78.79. MatrixXfm3;80. m3=m1*m2;4.co
25、ut<<"m3.rows()="<<m3.rows()<<""<<"m3.cols()="<<m3.cols()<<endl;cout<<"m3=n"<<m3<<endl;85.86. #pragmaendregion87.88. #pragmaregionResizing89.90.cout<<II*Resizing*”<<endl;91.92. /1D-resize93. v1.r
26、esize(4);94. cout<<"Recoverv1to4*1array:v1=n"<<v1<<endl;95.96. /2D-resize97. m.resize(2,3);98. m.resize(Eigen:NoChange,3);99. m.resizeLike(m2);100. m.resize(2,2);101.102. #pragmaendregion103.104. #pragmaregionCoeff_access105.106.cout<<,*Coefficientaccess*”<<en
27、dl;107.108. floattx=v1(1);109. tx=m1(1,1);110. cout<<endl;111.112. #pragmaendregion113.114.#pragmaregionPredefined_matrix115.116.cout<<"*PredefinedMatrix*"<<endl;117.118./1D-object119.typedefMatrix3fFixedXD;120.FixedXDx;121.122.x=FixedXD:Zero();123.x=FixedXD:Ones();124.x=
28、FixedXD:Constant(tx);/txisthevalue125.x=FixedXD:Random();126.cout<<"x=n"<<x<<endl;127.128.typedefArrayXfDynamic1D;129./或者typedefVectorXfDynamic1D130.intsize=3;131.Dynamic1Dxx;132.xx=Dynamic1D:Zero(size);133.xx=Dynamic1D:Ones(size);134.xx=Dynamic1D:Constant(size,tx);135.xx
29、=Dynamic1D:Random(size);136.cout<<"xx=n"<<x<<endl;137.138./2D-object139.typedefMatrixXfDynamic2D;140.Dynamic2Dy;141.y=Dynamic2D:Zero(rows,cols);142.y=Dynamic2D:Ones(rows,cols);143.y=Dynamic2D:Constant(rows,cols,tx);/txisthevalue144.y=Dynamic2D:Random(rows,cols);145.146.#pragma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年xx村集体经济分红会议记录
- 《全面掌握教学》课件
- 内蒙古准格尔旗高中数学 第三章 概率 3.1.4 概率的加法公式教学设计 新人教B版必修3
- 吉林科技职业技术学院《人体机能学》2023-2024学年第二学期期末试卷
- 山西工学院《Programming2》2023-2024学年第二学期期末试卷
- 辽宁机电职业技术学院《伴奏与弹唱》2023-2024学年第一学期期末试卷
- 茅台学院《金工手作基础工艺》2023-2024学年第二学期期末试卷
- 可克达拉职业技术学院《儿童文学素养》2023-2024学年第二学期期末试卷
- 商洛职业技术学院《危重病医学》2023-2024学年第一学期期末试卷
- 江西省赣州市会昌中学2025年高三高考最后一次模拟考试英语试题含解析
- 历代书法名作赏析课件
- 质量整改通知单(样板)
- 装配作业指导书
- 建设工程成本计划与控制课件(原)
- IPC-A-610国际标准中英文对照(doc 17)
- 《陕文投应聘表格》word版
- 建设工程围挡标准化管理图集(2022年版)
- (完整word版)中小学教育质量综合评价指标框架(试行)
- 《新概念英语》第一册单词表
- 半泽直树日语字幕台词(一)
- 拌和站地基承载力及抗倾覆计算书
评论
0/150
提交评论