版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+ 矩阵处理库 -Eigen 初步使用 (转载自 : CSDN cyxcw1 的博客 )2013-07-16 21:20:43| 分类: 计算机视觉 |举报 |字号 订阅 项目要进行比较多的矩阵操作, 特别是二维矩阵。 刚开始做实验时, 使用了动态 二维数组,于是写了一堆 Matrix 函数,作矩阵的乘除加减求逆求行列式。实验 做完了, 开始做代码优化, 发现 Matrix.h 文件里适用性太低, 而且动态二维数组 的空间分配与释放也影响效率,于是寻找其他解决方案。首先考虑的是与 Matlab 混合编程,折腾了半天把 Matlab 环境与 VS2010 环境之 后,发现 Matlab 编译出
2、来的函数使用起来也比较麻烦,要把数组转化成该函数 适用的类型后才能使用这些函数。 我的二维数组也不是上千万维的, 估计这个转 化的功夫就牺牲了一部分效率了。 (如果谁有混合编程的心得, 求帮忙,囧。) 接着想到使用一维数组的方法, 或者把一维数组封装在一个类里边。 想着又要写 一堆矩阵操作函数头就大,索性谷歌了一下矩阵处理库,除了自己之前知道的 OpenCV 库(之前由于转化 cvarr 麻烦,于是放弃),还有 Eigen, Armadillo 。 /houston11235/article/details/8501135 该博客对这三个库的 效率做了一个
3、简单的评测, OpenCV 库的矩阵操作效率是最低的, 还好我没使用。 Eigen 速度最快,与自己定义数组的操作效率相当( - -,才相当吗?我本来还想 找个更快的呢)。于是选择使用 Eigen 。进入正题。安装:/index.php?title=Main_Page 这里是官网,直接把包下 载下来,不大,也就几 M,我是直接放在自己项目文件夹(考虑项目封装时,这 样比较方便),放在 VS2010 文件夹。简单使用:看了一下官方文档, Eigen 库除了能实现各种矩阵操作外,貌似还提供数学分 析中的各种矩阵操作(包括 L 矩阵 U 矩阵)。目前
4、我使用到的还是简单的矩 阵操作,如加减乘除,求行列式,转置,逆,这些基本操作只要 :cpp view plaincopyprint?1. #include Eigen/Eigen2. using namespace Eigen;就能实现,别忘了名空间 Eigen 。包含的类型:Matrices ArraysMatrix RowVectorXiMatrix Matrix3fMatrix Vector4fMatrix MatrixXfMatrix VectorXdArray ArrayXXfArray ArrayXd Array RowArrayXi Array Array33f Array Ar
5、ray4f如上表,主要包括两种类型, Matrices 与 Arryays ,接着是这两种类型的派生类 型。现在我用到的是 Matrices(我不明白这两种类型在效率间有什么差距, 囧。), 其中 Matrix 代表二维矩阵, Vector 代表列向量 RowVector 代表行向量。如果后 面跟着 X,则代表是动态的数组,运行时可以根据需求改变,如果是数字,则代 表是静态的(根据实验,最多能建立 4 维的静态矩阵或者数组, - -,为嘛不是 6 维,实验正好需要)。 i 代表 int 类型, f 代表 float 类型, d 代表 double 。 对应关系:Matrix二维矩阵Vector
6、列向量RowVector行向量X动态固定数字 n静态, 4=n=1iintffloatd doubleArrays 类型的话也跟 Matrices 差不多。 基本操作,定义,初始化,矩阵操作: cpp view plaincopyprint?1. #include 2. #include Eigen/Eigen3. using namespace std;4. using namespace Eigen;5.6. void foo(MatrixXf& m)7. 8. Matrix3f m2=Matrix3f:Zero(3,3);9. m2(0,0)=1;10. m=m2;11. 12. int
7、 main()13. 14. /* 定义,定义时默认没有初始化,必须自己初始化 */15. MatrixXf m1(3,4); / 动态矩阵,建立 3 行 4 列。16. MatrixXf m2(4,3); /4 行 3 列,依此类推。17. MatrixXf m3(3,3);18. Vector3f v1;/ 若是静态数组,则不用指定行或者列19. /* 初始化 */20. m1 = MatrixXf:Zero(3,4); / 用 0 矩阵初始化 ,要指定行列数21. m2 = MatrixXf:Zero(4,3);22. m3 = MatrixXf:Identity(3,3); / 用单位
8、矩阵初始化23. v1 = Vector3f:Zero();/ 同理,若是静态的,不用指定行列数24.25. m1 1,0,0,1, / 也可以以这种方式初始化27.26. 1,5,0,1,0,0,9,1;8.m2 1,0,0,0,4,0,0,0,7,1,1,1;/* 元素的访问 */v11 = 1;m3(2,2) = 7;coutv1:nv1endl;coutm3:nm3endl;/* 复制操作 */Vector
9、Xf v2=v1; / 复制后,行数与列数和右边的 v1 相等 ,matrix 也是一样 ,/ 也可以通过这种方式重置动态数组的行数与列数 coutv2:nv2endl;/* 矩阵操作, 可以实现 + - * / 操作, 同样可以实现连续操作 (但是维数必 须符合情况 ),如 m1,m2,m3 维数相同 , 则可以 m1 = m2 + m3 + m1; */m3 = m1 * m2;v2 += v1;coutm3:nm3endl;coutv2:nv2endl;/m3 = m3.transpose(); 这句出现错误,估计不能给自己赋值coutm3 转置 :nm3.transpose()endl
10、;coutm3 行列式 :nm3.determinant()endl;m3 = m3.reverse();coutm3 求逆 :nm3endl;system(pause);return 0;输出:html view plaincopyprint?1. v1:2. 03. 14. 05. m3:6. 1 0 07. 0 1 08. 0 0 79. v2:10. 011. 112. 013. m3:14. 2 1 115. 2 21 116. 1 1 6417. v2:18. 019. 220. 021. m3 转置:22. 2 2 123. 1 21 124. 1 1 6425. m3 行列式
11、:26. 254027. m3 求逆:28. 64 1 129. 1 21 1基本的操作就是以上这些,有了这个库,以后就不用做重复工作了!C+ 矩阵处理工具 Eigen分类: C/C+ MATLAB Linux & MAC 2012-07-24 20:37 18047 人阅读 评论 (32) 收藏 举报 工具 c+matrixrandominitializationmatlab最近和一些朋友讨论到了 C+ 中数学工具的问题,以前总是很 2 地自己写矩阵运算,或者 有时候在 matlab 里计算了一些数据再往 C 程序里倒,唉 想想那些年,我们白写的代码 啊人家早已封装好了! 首先推荐几个可以在
12、 C+ 中调用的数学平台: eigen 、bias 、lapack 、 svd 、 CMatrix ,本文着重 eigen 做以讲解,希望对各位有所帮助。 下面是本文主线,主要围绕下面几点进行讲解:Eigen 是什么?Eigen3 哪里下载?Eigen3 的配置Eigen3 样例代码有没有?去哪里更深入学习?Eigen 是什么?Eigen 是 C+ 中可以用来调用并进行矩阵计算的一个库,里面封装了一些类 ,需要的头文件和功能如下:Eigen 的主页 上有一些更详细的 Eigen 介绍。Eigen3 哪里下载?这里是 我下好的,这里 是官网主页,请自行下载,是个 code 包,不用安装。Eige
13、n 的配置直接上图了,附加包含目录那里填上你放 Eigen 文件夹的位置即可。Eigen 的样例代码有没有?当然有,这篇文章重点就是这里!以下是我整理的一些常用操作,基本的矩阵运算就在下面了,算是个入门吧 主要分以下几部分:建议大家放到编译环境里去看,因为我这里有一些 region 的东西,编译器下更方便看 cpp view plaincopy1.#include 2.#include 3.4./using Eigen:MatrixXd;5.using namespace Eigen;6.using namespace Eigen:internal;7.using namespace Eige
14、n:Architecture;8.9.using namespace std;10.11.12.int main()13.14.15.#pragma region one_d_object16.17.cout *1D-object*endl;18.19.Vector4d v1;20.v1 1,2,3,4;21.cout v1=n v1endl;22.23.VectorXd v2(3);24.v21,2,3;25.cout v2=n v2endl;26.27.Array4i v3;28.v31,2,3,4;29.cout v3=n v3endl;30.31.ArrayXf v4(3);32.v4
15、1,2,3;33.cout v4=n v4endl;34.35.#pragma endregion36.37.#pragma region two_d_object38.39.cout *2D-object*endl;40./2D objects:41.MatrixXd m(2,2);42.43./method 144.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./method 250.m3,-1,51.2.5,-1.5;52.cout m=n m endl;53.54.#pragma
16、endregion55.56.#pragma region Comma_initializer57.58.cout *Initialization*endl;59.60.int rows=5;61.int cols=5;62.MatrixXf m1(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 m1=n m1endl;68.69.
17、#pragma endregion70.71.#pragma region Runtime_info72.73.cout*Runtime Info*endl;74.75.MatrixXf m2(5,4);76.m2MatrixXf:Identity(5,4);77.cout m2=n m2endl;78.79.MatrixXf m3;80.m3=m1*m2;81.cout m3.rows()= m3.rows() ; 82. m3.cols()= m3.cols()endl;83.84.cout m3=n m3endl;85.86.#pragma endregion87.88.#pragma
18、region Resizing89.90.cout *Resizing*endl;91.92./1D-resize93.v1.resize(4);94.cout Recover v1 to 4*1 array : v1=n v1endl;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.#pragma endregion103.104.#pragma region Coeff_access105.106.cout *Coeff
19、icient access*endl;107.108.float tx=v1(1);109.tx=m1(1,1);110.coutendl;111.112.#pragma endregion113.114.#pragma region Predefined_matrix115.116.cout *Predefined Matrix*endl;117.118./1D-object119.typedef Matrix3f FixedXD;120.FixedXD x;121.122.x=FixedXD:Zero();123.x=FixedXD:Ones();124.x=FixedXD:Constan
20、t(tx);/tx is the value125.x=FixedXD:Random();126.cout x=n xendl;127.128.typedef ArrayXf Dynamic1D;129./ 或者 typedef VectorXf Dynamic1D130.int size=3;131.Dynamic1D xx;132.xx=Dynamic1D:Zero(size);133.xx=Dynamic1D:Ones(size);134.xx=Dynamic1D:Constant(size,tx);135.xx=Dynamic1D:Random(size);136.cout xx=n xendl;137.138./2D-object139.typedef MatrixXf Dynamic2D;140.Dynamic2D y;141.y=Dynamic2D:Zero(rows,cols);142.y=Dynamic2D:Ones(rows,cols);143.y=Dynamic2D:Constant(rows,cols,tx); /tx is the value144.y=Dynamic2D:Random(rows,cols);145.146.#pragma endregion147.148.#pragma region Ari
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论