C++ 矩阵运算工具箱Eigen

来源:互联网 发布:小型企业网络搭建 编辑:程序博客网 时间:2024/06/08 09:08

1. 简介

因为要把MATLAB的算法写成C++的程序,涉及到的矩阵运算较多,所以需要找个好用的矩阵运算库。现成的矩阵运算库很多,但是使用的难易程度和计算性能差别很大。如果一个库安装比较方便,并且符号规则和MATLAB相似,那就最好了。最终看到这里有个推荐,发现了Eigen这个库。

Eigen的最大优势是使用方便,且跨平台。它本身仅有许多头文件组成,使用时做的就是把用到的头文件和代码放在一起就可以了。另外用户众多(如google),这样有问题时查找也比较方便。它本身也有个wiki,因此说明性文档也算全面。

2. 安装配置

使用Eigen非常简单。这里介绍VS2008工程使用Eigen的配置。从官网上下载压缩包后,解压在硬盘任意位置,新建c++ project,在project-properties-c/c++-general -Additional Include Directories添加Eigen文件夹的路径,如"XXXXX\EIGEN\eigen\"。CPP的文件头包含
[cpp] view plaincopy
  1. #include <Eigen/Dense>  
  2. using namespace Eigen;  

即可使用。

3. 示例程序

Eigen中常用的数据类型是matrix和vector,对于浮点运算,Eigen 支持float和double。另外,matrix和vector分为固定大小(Fixed size)和动态大小(Dynamic size)两种。以matrix为例,做如下定义:
[cpp] view plaincopy
  1. Matrix3f a;  
  2. MatrixXf b;  
  3. MatrixXf c(10,15);  

即定义了一个3-by-3的方阵a,其中的数据类型是float,一个动态长度的矩阵b,其当前大小为0-by-0,但可以被赋值为任意大小,以及一个10-by-15的矩阵c。如果使用double,则将MatrixXf 替换为MatrixXd。vector的定义方法类似。
通过官网上一段完整的程序,可以了解使用Eigen以及定义matrix或vector的基本方法。
[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <Eigen/Dense>  
  3. using namespace Eigen;  
  4. int main()  
  5. {  
  6.   MatrixXd m(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::cout << "Here is the matrix m:\n" << m << std::endl;  
  12.   VectorXd v(2);  
  13.   v(0) = 4;  
  14.   v(1) = v(0) - 1;  
  15.   std::cout << "Here is the vector v:\n" << v << std::endl;  
  16. }  

输出结果为:
[plain] view plaincopy
  1. Here is the matrix m:  
  2.   3  -1  
  3. 2.5 1.5  
  4. Here is the vector v:  
  5. 4  
  6. 3  

4. 常用操作

4.1 初始化

当固定大小vector小于4个变量时,可以采用如下方法初始化:
[cpp] view plaincopy
  1. Vector2d a(5.0, 6.0);  
  2. Vector3d b(5.0, 6.0, 7.0);  
  3. Vector4d c(5.0, 6.0, 7.0, 8.0);  

一般而言,Eigen提供了用逗号初始化的语法格式:
[cpp] view plaincopy
  1. Matrix3f m;  
  2. m << 1, 2, 3,  
  3.      4, 5, 6,  
  4.      7, 8, 9;  
这样m为:
[plain] view plaincopy
  1. 1 2 3  
  2. 4 5 6  
  3. 7 8 9  

除此之外,和MATLAB类似,Eigen也支持初始化为特殊矩阵或向量,这里简单总结如下:
MATLABEIGENzeros()setZero()rand()setRandom()eye()setIdentity()ones()setOnes()

转自:http://blog.csdn.net/mr_xue/article/details/15504479
0 0
原创粉丝点击