C++ 开源矩阵 运算工具——Eigen

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

这几天,一直忙着帮学院一个老师做一个软件的功能模块,

模块要求是 矩阵的一系列运算,

本来是要自己写的,后来,发现有现成的工具,很多,我最后选择了Eigen,

因为它方便啊~  只需要把文件夹放到include文件夹下,就可以用了,打包什么也方便。

而且,跟别的工具比较一下,发现速度上也有一定的优势。

我是看这个东东的  →  这个
和  这个

虽然,它函数名和Matlab差别有些大,可是,我不会用Matlab,就不会有用惯Matlab的人的别扭问题存在啦~~

最后,它的教程比较少,基本都是国外,自己看,

我就整理整理,发出来我自己的学习心得,应该是比较完整并清晰的博文了,

因为,我也是新手,犯错难免,希望大家能指出,共同进步!

更多精彩内容,尽在:http://blog.csdn.net/lttree

Ok,废话不多说,开练吧!

1.首先,要把这个东东加到VS中,提供我们使用。

先下载,解压缩:  http://eigen.tuxfamily.org/index.php?title=Main_Page

我的环境是 WIN7+VS2010 下载的3.2.2版本。

解压缩以后有这个文件夹:eigen-eigen-1306d75b4a21

恩,我只取了里面的 Eigen文件夹,

放到了VS2010文件夹下的vs_2010文件夹下VC文件夹下的include文件夹中,

也就是: 盘符:\VS2010\vs_2010\VC\include

(我不知道别人怎么放得,反正我是这么用的=  = 。

然后就可以新建项目了,新建项目后,可以用:

#include "Eigen/Eigen"
using namespace Eigen;

加进来它的头文件,使用命名空间,

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.tuxfamily.org/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,矩阵存储的是整数类型

相应关系为:

比如:

MatrixXf m1(3,4);   //建立3行4列的动态矩阵
MatrixXf m2(3,3);
Vector3f v1;        //建立静态向量 

X代表动态,f代表float型

→②初始化

m1=MatrixXf::Zero(3,4);		// 将矩阵3行4列初始化为0
m2=MatrixXf::Ones(3,3);		// 将矩阵3行3列初始化为1
v1=Vector3f::Ones();		// 将3行的纵向量初始化为1

cout<<"m1=\n"<<m1<<endl;
cout<<"m2=\n"<<m2<<endl;
cout<<"v1=\n"<<v1<<endl;

运行出来效果:

进一步,测试一下:

MatrixXf m3(4,5);
m3=MatrixXf::Zero(4,5);
cout<<"m3_1=\n"<<m3<<endl;
m3=MatrixXf::Ones(3,3);
cout<<"m3_2=\n"<<m3<<endl;
m3=MatrixXf::Ones(6,6);
cout<<"m3_3=\n"<<m3<<endl;

先定义一个,4行5列的矩阵

初始化为0,4行5列,这时输出,就发现是4行5列的0

初始化为3行3列的1,输出,3行3列的1

初始化为6行6列的1,输出,则成为6行6列的1,

具体看图:

也就是说,矩阵的大小与初始化息息相关,初始化多少,它就是多少。

谁让它是动态的呢?!

那么,你肯定会说,定义的时候声明行列干啥?

因为,下种方法初始化,就需要行列值了:

MatrixXf m3(2,3);
m3<<1,2,3,4,5,6;
cout<<"m3_1\n"<<endl;
// 为了美观点,更像个矩阵,可以换行写
m3<<1.3,4,-8,
    0,0.9,2;
cout<<"m3_2=\n"<<m3<<endl;

运行出来就是:

是不是非常简单粗暴的呢?

更多精彩内容,尽在:http://blog.csdn.net/lttree

→③访问

这个就很简单了,直接就同数组的访问方式,

但是不是方括号,而是圆括号:

MatrixXf m3(2,3);
m3<<1,2,3,4,5,6;
cout<<"m3_1\n"<<m3<<endl;
// 为了美观点,更像个矩阵,可以换行写
m3<<1.3,4,-8,
    0,0.9,2;
cout<<"m3_2=\n"<<m3<<endl;
// 将第2行第3列的值改为99
m3(1,2)=99;
cout<<"m3_3=\n"<<m3<<endl;

当然,同数组一样,第一行第一列的下标为(0,0)

4.矩阵的基础运算

代码执行了矩阵的:

——置0

——置1

——随机矩阵

——单位阵

——求逆

——转置

——数乘矩阵

<span style="white-space:pre">	</span>MatrixXf m1(3,3);
	// 矩阵全部元素置0
	m1.setZero();
	cout<<"m1_1=\n"<<m1<<endl;
	// 矩阵全部元素置1 ( 这里行列值不填,默认定义时候的行列,
	//                     若填写,则矩阵也会更改为填写的行列值 )
	m1.setOnes(2,2);
	cout<<"m1_2=\n"<<m1<<endl;
	// 随机生成一个矩阵
	m1.setRandom();
	cout<<"m1_3=\n"<<m1<<endl;
	// 置单位矩阵
	m1.setIdentity(3,3);
	cout<<"m1_4=\n"<<m1<<endl;
	m1<< 1 , 2 , 3 ,
		5 , 9 ,10 ,
		7 , 0 ,1 ;
	// 矩阵求逆
	m1.inverse();
	cout<<"m1_5=\n"<<m1<<endl;
	// 矩阵转置
	m1.transpose();
	cout<<"m1_6=\n"<<m1<<endl;
	// 数 * 矩阵 ( 数 / 矩阵 )
	m1 = 2.6 * m1 ;
	cout<<"m1_7=\n"<<m1<<endl;

运行结果,如下:

啊,还有矩阵的加减乘除,

额。。。

这个不用写了吧?

和平常的加减乘除一样的,

就是矩阵乘法要注意,两个矩阵的行列值哟~

5.矩阵的高级运算

后期更新,先到这里。。。

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

时间: 2024-08-06 16:03:07

C++ 开源矩阵 运算工具——Eigen的相关文章

c++处理矩阵操作:Eigen库初步学习使用

前言: Eigen 是一个线性算术的C++模板库,包括:vectors, matrices, 开源以及相关算法.功能强大.快速.优雅以及支持多平台,可以使用该库来方便处理一些矩阵的操作,达到类似matlab那样的快捷.现在已经发展到Eigen3了,目前最新版本为Eigen 3.1.2. Eigen使用预备工作: 首先到Eigen官网上下载Eigen源码包,下载后解压完直接放到自己平时软件所在的目录下,不需要安装.Eigen下载地址为:http://eigen.tuxfamily.org/inde

[转载] 一共81个,开源大数据处理工具汇总(上)

原文: http://www.36dsj.com/archives/24852 本文一共分为上下两部分.我们将针对大数据开源工具不同的用处来进行分类,并且附上了官网和部分下载链接,希望能给做大数据的朋友做个参考.下面是第一部分. 查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动. Phoenix查询

跟王老师学异常(八):开源日志记录工具log4j的使用案例

开源日志记录工具log4j的使用 主讲人:王少华  QQ群号:483773664 学习目标 掌握Log4J在java项目中的应用 一.日志分类及log4j介绍 (一)日志及分类 1 日志 主要用来记录系统运行中一些重要操作信息 便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因 2.分类 SQL日志:记录系统执行的SQL语句 异常日志:记录系统运行中发生的异常事件 业务日志:记录系统运行过程.如用户登录.操作记录 (二)Log4j介绍 Log4j是Apac

开源的数据挖掘工具

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 本文的主要内容编译自Blaz Zupan和Janez Demsar的一篇论文(Open-Source Tools for Data Mining).我仅仅选择其中的要点和大家共享,同时加入一些个人的点评意见. 此外,对开源的数据挖掘工具有兴趣的同仁,可以关注以下OSDM09这个workshop,它会在PAKDD'09上同时进行,主要

ArgoUML -- 开源UML 建模工具

目前的0.18.1已经可以运行在Java1.4上了,而且它是开源(遵循BSD协议)和免费的UML制作工具,最主要的是只要添加它的模块包就能支持C#了. 我们最熟悉的商业UML建模工具恐怕就是Rational Rose了,当然除了它比较昂贵的价格外,伴随着它强大且烦杂的功能其安装下来也要有400M之多:那么argouml有什么独到之处呢,除了安装简便(安装完成仅有不到6M的大小)之外,还有以下特点: 1.Cognitive Psychology:符合认知心理学: 2.open standards:

55种开源数据可视化工具简介

55种开源数据可视化工具简介 雪姬 2015-04-21 11:47:56 数据可视化 评论(2)   数据时代数据可视化成为理解和表达数据的有效甚至是唯一的手段. 一共56个,盘点最实用的大数据可视化分析工具 工欲善其事必先利其器,本文对55个流行的数据可视化工具开源协议,主页,文档,案例等资源的进行简单介绍,其中包括著名的D3.js,R,Gephi,Raphaël,Processing.js,Tableau Public,Google Chart Tools,Arbor.js等,资料来源ht

10款免费且开源的项目管理工具

在任何一个项目开发或设计中,项目管理被认为最重要的过程之一,因此,选择一款适宜的项目管理工具尤为重要.项目管理是指管理项目计划.定义.监控.控制以及确认交付的过程,因此它的优势也是被公认的. 随 着各个领域特定项目管理需求的提升,这就需要一个更好的.免费的项目管理工具来管理.因此一款高效的.良好的项目管理必须具备快速的.强大的且包含以下功 能:调度.成本控制.资源分配.预算管理.文档.协作以及沟通.本文,笔者收集了10款最佳的免费且开源的项目管理工具,希望对你有所帮助! OpenProj Ope

2014 非常好用的开源 Android 测试工具

2014 非常好用的开源 Android 测试工具 - 开源中国社区 当前有很大的趋势是转向移动应用平台,Android 是最广泛使用的移动操作系统,2014 年大约占 80% 以上的市场.在开发 Android 应用的时候要进行测试,现在市场上有大量的测试工具. 本文主要是展示一系列的开源 Android 测试工具.每个工具都会有相应的简短介绍,还有一些相关的资源.Android 测试工具列表是按照字母来排序的,最后还会介绍几个不是特别活跃的 Android 测试相关的开源项目. 本文提到的开

史上最全开源大数据工具汇总

摘要 史上最全的开源大数据工具,非常实用,请务必收藏! 史上最全的开源大数据工具,非常实用,请务必收藏! 查询引擎 Phoenix Salesforce公司出品,Apache HBase之上的一个SQL中间层,完全使用Java编写 Stinger 原叫Tez,下一代Hive, Hortonworks主导开发,运行在YARN上的DAG计算框架 Presto Facebook开源 Spark SQL Spark上的SQL执行引擎 Pig 基于Hadoop MapReduce的脚本语言 Clouder