模块要求是 矩阵的一系列运算, 本来是要自己写的,后来,发现有现成的工具,很多,我最后选择了Eigen, 因为它方便啊~ 只需要把文件夹放到include文件夹下,就可以用了,打包什么也方便。 而且,跟别的工具比较一下,发现速度上也有一定的优势。
虽然,它函数名和Matlab差别有些大,可是,我不会用Matlab,就不会有用惯Matlab的人的别扭问题存在啦~~ 最后,它的教程比较少,基本都是国外,自己看,
我就整理整理,发出来我自己的学习心得,应该是比较完整并清晰的博文了, 因为,我也是新手,犯错难免,希望大家能指出,共同进步! 更多精彩内容,尽在:http://blog.csdn.net/lttree Ok,废话不多说,开练吧!
1.首先,要把这个东东加到VS中, 先下载,解压缩: http://eigen./index.php?title=Main_Page 我的环境是 WIN7+VS2010 下载的3.2.2版本。
解压缩以后有这个文件夹:eigen-eigen-1306d75b4a21 恩,我只取了里面的 Eigen文件夹, 放到了VS2010文件夹下的vs_2010文件夹下VC文件夹下的include文件夹中, 也就是: 盘符:\VS2010\vs_2010\VC\include (我不知道别人怎么放得,反正我是这么用的= = 。
然后就可以新建项目了,新建项目后,可以用:
加进来它的头文件,使用命名空间,
and then 你就可以用它的函数了。
2.认识它的一些头文件。 Eigen这个类库,存的东西好多的,来看一下主要的几个头文件吧:
更多精彩内容,尽在:http://blog.csdn.net/lttree 啊?有是英语?!! 不要怕,要多看,多读,多认! 最上面那段英文意思是: Eigen库分为 核心模块和额外模块两部分, 每个模块都有一个用这个模块所相对应的头文件, Eigen和Dense头文件方便的同时包含了几个头文件以供使用。
——Core 有关矩阵和数组的类,有基本的线性代数(包含 三角形 和 自伴乘积 相关),还有相应对数组的操作。 ——Geometry 几何学的类,有关转换、平移、进位制、2D旋转、3D旋转(四元组和角轴相关) ——LU 逻辑单元的类,有关求逆,求行列式,LU分解解算器(FullPivLU,PartialPivLU) ——Cholesky 包含LLT和LDLT的乔里斯基因式分解法。 (小科普:Cholesky分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解) ——Householder 豪斯霍尔德变换,这个模块供几个线性代数模块使用。 (Householder transform: 维基百科 ) ——SVD 奇异值分解,最小二乘解算器解决奇异值分解。 ——QR QR分解求解,三种方法:HouseholderQR、ColPivHouseholderQR、FullPivHouseholderQR ——Eigenvalues 特征值和特征向量分解的方法:EigenSolver、SelfAdjointEigenSolver、ComplexEigenSolver ——Sparse 稀疏矩阵相关类,对于稀疏矩阵的存储及相关基本线性代数 ——Dense 包含: Core、Gelometry、LU、Cholesky、SVD、QR和Eigenvalues模块(头文件) ——Eigen 包含上述所有的模块(头文件)
关于上述东东,更详细的解释,可以看文档:http://eigen./dox/group__QuickRefPage.html
3.对矩阵的简单操作 Eigen提供了两种密集的对象Matrix(矩阵)和Vector(向量)。 这两者是通过矩阵模板类和一维或二维的数组模板类来实现的。 这两者有几点不同: ——Matrix类型变量加减法,若行列数不相等,则不能做加减; Array类型的可以加减一个常数(各个元素分别加减该常数)。 ——Matrix与Array类型变量做乘法也会有不同,Matrix是矩阵相乘,Array是对应元素相乘。 ——但两者可以相互转换,方法为 .array() 和 .matrix()。
更多精彩内容,尽在:http://blog.csdn.net/lttree →①定义(注意:定义矩阵时,默认没有初始化,必须自己初始化) Eigen的矩阵类型,一般是Matrix后面跟类型符号来表示,比如说: ——' d ' 代表 double,矩阵存储的是double型的数据 ——' f ' 代表float,矩阵存储的是float类型数据 ——' c '代表complex,矩阵存数的是复数类型数据 ——' i '代表int,矩阵存储的是整数类型
相应关系为:
比如:
X代表动态,f代表float型
→②初始化
运行出来效果:
进一步,
先定义一个,4行5列的矩阵 初始化为0,4行5列,这时输出,就发现是4行5列的0 初始化为3行3列的1,输出,3行3列的1 初始化为6行6列的1,输出,则成为6行6列的1, 具体看图:
也就是说,矩阵的大小与初始化息息相关,初始化多少,它就是多少。 谁让它是动态的呢?!
那么,你肯定会说,定义的时候声明行列干啥? 因为,下种方法初始化,就需要行列值了:
运行出来就是:
是不是非常简单粗暴的呢? 更多精彩内容,尽在:http://blog.csdn.net/lttree
→③访问 这个就很简单了,直接就同数组的访问方式, 但是不是方括号,而是圆括号:
当然,同数组一样,第一行第一列的下标为(0,0)
4.矩阵的基础运算 代码执行了矩阵的: ——置0 ——置1 ——随机矩阵 ——单位阵 ——求逆 ——转置 ——数乘矩阵
运行结果, ![]()
啊,还有矩阵的加减乘除, 额。。。 这个不用写了吧? 和平常的加减乘除一样的, 就是矩阵乘法要注意,两个矩阵的行列值哟~
5.矩阵的高级运算 后期更新,先到这里。。。 |
|