eigen 初探

来源:互联网 发布:linux telnet远程登录 编辑:程序博客网 时间:2024/05/20 02:27

转自:http://blog.csdn.net/abcjennifer/article/details/7781936

最近和一些朋友讨论到了C++中数学工具的问题,以前总是很2地自己写矩阵运算,或者有时候在matlab里计算了一些数据再往C程序里倒,唉~想想那些年,我们白写的代码啊……人家早已封装好了!首先推荐几个可以在C++中调用的数学平台:eigen、bias、lapack、svd、CMatrix,本文着重eigen做以讲解,希望对各位有所帮助。

下面是本文主线,主要围绕下面几点进行讲解:

**********************************************************************************************

Eigen是什么?

Eigen3哪里下载?

Eigen3的配置

Eigen3 样例代码有没有?

去哪里更深入学习?

**********************************************************************************************

Eigen是什么?

Eigen是C++中可以用来调用并进行矩阵计算的一个库,里面封装了一些类,需要的头文件和功能如下:


Eigen的主页上有一些更详细的Eigen介绍。


Eigen3哪里下载?

这里是我下好的,这里是官网主页,请自行下载,是个code包,不用安装。


Eigen的配置


直接上图了,附加包含目录那里填上你放Eigen文件夹的位置即可。


Eigen的样例代码有没有?

当然有,这篇文章重点就是这里!

以下是我整理的一些常用操作,基本的矩阵运算就在下面了,算是个入门吧~主要分以下几部分:



建议大家放到编译环境里去看,因为我这里有一些region的东西,编译器下更方便看~

[cpp] view plaincopyprint?
  1. #include <iostream> 
  2. #include <Eigen/Dense> 
  3.  
  4. //using Eigen::MatrixXd; 
  5. using namespace Eigen; 
  6. using namespace Eigen::internal; 
  7. using namespace Eigen::Architecture; 
  8.  
  9. using namespace std; 
  10.  
  11.  
  12. int main() 
  13.  
  14. #pragma region one_d_object 
  15.  
  16.     cout<<"*******************1D-object****************"<<endl; 
  17.  
  18.     Vector4d v1; 
  19.     v1<< 1,2,3,4; 
  20.     cout<<"v1=\n"<<v1<<endl; 
  21.  
  22.     VectorXd v2(3); 
  23.     v2<<1,2,3; 
  24.     cout<<"v2=\n"<<v2<<endl; 
  25.  
  26.     Array4i v3; 
  27.     v3<<1,2,3,4; 
  28.     cout<<"v3=\n"<<v3<<endl; 
  29.  
  30.     ArrayXf v4(3); 
  31.     v4<<1,2,3; 
  32.     cout<<"v4=\n"<<v4<<endl; 
  33.  
  34. #pragma endregion 
  35.  
  36. #pragma region two_d_object 
  37.      
  38.     cout<<"*******************2D-object****************"<<endl; 
  39.     //2D objects: 
  40.     MatrixXd m(2,2); 
  41.  
  42.     //method 1 
  43.     m(0,0) = 3; 
  44.     m(1,0) = 2.5; 
  45.     m(0,1) = -1; 
  46.     m(1,1) = m(1,0) + m(0,1); 
  47.  
  48.     //method 2 
  49.     m<<3,-1, 
  50.         2.5,-1.5; 
  51.     cout <<"m=\n"<< m << endl; 
  52.  
  53. #pragma endregion 
  54.  
  55. #pragma region Comma_initializer 
  56.  
  57.     cout<<"*******************Initialization****************"<<endl; 
  58.  
  59.     int rows=5; 
  60.     int cols=5; 
  61.     MatrixXf m1(rows,cols); 
  62.     m1<<( Matrix3f()<<1,2,3,4,5,6,7,8,9 ).finished(), 
  63.         MatrixXf::Zero(3,cols-3), 
  64.         MatrixXf::Zero(rows-3,3), 
  65.         MatrixXf::Identity(rows-3,cols-3); 
  66.     cout<<"m1=\n"<<m1<<endl; 
  67.  
  68. #pragma endregion 
  69.  
  70. #pragma region Runtime_info 
  71.      
  72.     cout<<"*******************Runtime Info****************"<<endl; 
  73.  
  74.     MatrixXf m2(5,4); 
  75.     m2<<MatrixXf::Identity(5,4); 
  76.     cout<<"m2=\n"<<m2<<endl; 
  77.  
  78.     MatrixXf m3; 
  79.     m3=m1*m2; 
  80.     cout<<"m3.rows()="<<m3.rows()<<"  ;  " 
  81.              <<"m3.cols()="<< m3.cols()<<endl; 
  82.      
  83.     cout<<"m3=\n"<<m3<<endl; 
  84.  
  85. #pragma endregion 
  86.      
  87. #pragma region Resizing 
  88.      
  89.     cout<<"*******************Resizing****************"<<endl; 
  90.  
  91.     //1D-resize  
  92.     v1.resize(4); 
  93.     cout<<"Recover v1 to 4*1 array : v1=\n"<<v1<<endl; 
  94.  
  95.     //2D-resize 
  96.     m.resize(2,3); 
  97.     m.resize(Eigen::NoChange, 3); 
  98.     m.resizeLike(m2); 
  99.     m.resize(2,2); 
  100.      
  101. #pragma endregion 
  102.  
  103. #pragma region Coeff_access 
  104.      
  105.     cout<<"*******************Coefficient access****************"<<endl; 
  106.  
  107.     float tx=v1(1); 
  108.     tx=m1(1,1); 
  109.     cout<<endl; 
  110.  
  111. #pragma endregion 
  112.  
  113. #pragma  region Predefined_matrix 
  114.  
  115.     cout<<"*******************Predefined Matrix****************"<<endl; 
  116.  
  117.     //1D-object 
  118.     typedef  Matrix3f   FixedXD; 
  119.     FixedXD x; 
  120.      
  121.     x=FixedXD::Zero(); 
  122.     x=FixedXD::Ones(); 
  123.     x=FixedXD::Constant(tx);//tx is the value 
  124.     x=FixedXD::Random(); 
  125.     cout<<"x=\n"<<x<<endl; 
  126.  
  127.     typedef ArrayXf Dynamic1D; 
  128.     //或者 typedef VectorXf Dynamic1D 
  129.     int size=3; 
  130.     Dynamic1D xx; 
  131.     xx=Dynamic1D::Zero(size); 
  132.     xx=Dynamic1D::Ones(size); 
  133.     xx=Dynamic1D::Constant(size,tx); 
  134.     xx=Dynamic1D::Random(size); 
  135.     cout<<"xx=\n"<<x<<endl; 
  136.  
  137.     //2D-object 
  138.     typedef MatrixXf Dynamic2D; 
  139.     Dynamic2D y; 
  140.     y=Dynamic2D::Zero(rows,cols); 
  141.     y=Dynamic2D::Ones(rows,cols); 
  142.     y=Dynamic2D::Constant(rows,cols,tx);//tx is the value 
  143.     y=Dynamic2D::Random(rows,cols); 
  144.  
  145. #pragma endregion 
  146.  
  147. #pragma region Arithmetic_Operators 
  148.  
  149.     cout<<"******************* Arithmetic_Operators****************"<<endl; 
  150.  
  151.     //add & sub 
  152.     MatrixXf m4(5,4); 
  153.     MatrixXf m5; 
  154.     m4=m2+m3; 
  155.     m3-=m2; 
  156.  
  157.     //product 
  158.     m3=m1*m2; 
  159.   
  160.     //transposition 
  161.     m5=m4.transpose(); 
  162.     //m5=m.adjoint();//伴随矩阵  
  163.      
  164.     //dot product 
  165.     double xtt; 
  166.     cout<<"v1=\n"<<v1<<endl; 
  167.     v2.resize(4); 
  168.     v2<<VectorXd::Ones(4); 
  169.     cout<<"v2=\n"<<v2<<endl; 
  170.  
  171.     cout<<"*************dot product*************"<<endl; 
  172.     xtt=v1.dot(v2); 
  173.     cout<<"v1.*v2="<<xtt<<endl; 
  174.  
  175.     //vector norm 
  176.  
  177.     cout<<"*************matrix norm*************"<<endl; 
  178.     xtt=v1.norm(); 
  179.     cout<<"norm of v1="<<xtt<<endl; 
  180.     xtt=v1.squaredNorm(); 
  181.     cout<<"SquareNorm of v1="<<xtt<<endl; 
  182.  
  183. #pragma endregion 
  184.  
  185. cout<<endl; 



 



 

去哪里更深入学习?

Please refer toEigen中的类及函数、Eigen的官方教程,和一些教程上的相关内容。


 

原创粉丝点击