特色技术
专业从事预应力结构体系的设计、施工一体化解决方案
线性代数计算库Eigen(二)
- 分类:程序技术
- 作者:
- 来源:
- 发布时间:2018-10-12 15:16
- 访问量:
【概要描述】(三)头文件: 类库就是C++的一个子系统,Eigen作为解决线性代数的类库,存的类和函数很多,因此就包含了很多头文件。以下是主要的几个头文件,如图2所示。图2、Eigen头文件 最上面那段英文意思是:Eigen库分为核心模块和额外模块两部分,每个模块都有一个用这个模块所相对应的头文件,Eigen和Dense头文件方便的同时包含了几个头文件以供使用。 (1)Core: 有关矩阵和数组的类,
线性代数计算库Eigen(二)
【概要描述】(三)头文件: 类库就是C++的一个子系统,Eigen作为解决线性代数的类库,存的类和函数很多,因此就包含了很多头文件。以下是主要的几个头文件,如图2所示。图2、Eigen头文件 最上面那段英文意思是:Eigen库分为核心模块和额外模块两部分,每个模块都有一个用这个模块所相对应的头文件,Eigen和Dense头文件方便的同时包含了几个头文件以供使用。 (1)Core: 有关矩阵和数组的类,
- 分类:程序技术
- 作者:
- 来源:
- 发布时间:2018-10-12 15:16
- 访问量:
(三)头文件:
类库就是C++的一个子系统,Eigen作为解决线性代数的类库,存的类和函数很多,因此就包含了很多头文件。以下是主要的几个头文件,如图2所示。
图2、Eigen头文件
最上面那段英文意思是:Eigen库分为核心模块和额外模块两部分,每个模块都有一个用这个模块所相对应的头文件,Eigen和Dense头文件方便的同时包含了几个头文件以供使用。
(1)Core:
有关矩阵和数组的类,有基本的线性代数(包含三角形和自伴乘积相关),还有相应对数组的操作。
(2)Geometry
几何学的类,有关转换、平移、进位制、2D旋转、3D旋转(四元组和角轴相关)。
(3)LU
逻辑单元的类,有关求逆,求行列式,LU分解解算器(FullPivLU,PartialPivLU)。
(4)Cholesky
包含LLT和LDLT的乔里斯基因式分解法。Cholesky分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。
(5)Householder
豪斯霍尔德变换,这个模块供几个线性代数模块使用。这一变换将一个向量变换为由一个超平面反射的镜像,是一种线性变换。其变换矩阵被称作豪斯霍尔德矩阵。
(6)SVD
奇异值分解,最小二乘解算器解决奇异值分解。
(7)QR(QR分解求解)
HouseholderQR,ColPivHouseholderQR,FullPivHouseholderQR。
(8)Eigenvalues(特征值和特征向量分解)
EigenSolver,SelfAdjointEigenSolver,ComplexEigenSolver。
(9)Sparse
稀疏矩阵相关类,对于稀疏矩阵的存储及相关基本线性代数
(10)Dense
包含: Core、Gelometry、LU、Cholesky、SVD、QR和Eigenvalues模块(头文件)
(11)Eigen
包含上述所有的模块(头文件)
(四)定义:
template<typename_Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
classEigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols >
Eigen中关于矩阵类的模板函数中,共有六个模板参数,常用的只有前三个。其前三个参数分别表示矩阵元素的类型、行数和列数。剩下的三个参数都有默认值。
1、在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,vectors 只是一种特殊的矩阵,行或者列为1。
2、Matrix:
(1)Matrix 的三个强制的模板参数:
Matrix<typenameScalar, int RowsAtCompileTime, int ColsAtCompileTime>
其中参数Scalar 就是矩阵元素标量类型。可以是float, double, bool,int, std::complex<float>
参数RowsAtCompileTime 和参数ColsAtCompileTime分别指编译时的行和列值。
(2)数据存储顺序:
Matrix创建的矩阵一般用第四个参数 Option表示按列排列还是按行排列,默认是按列存储,Eigen在处理按列存储的矩阵时会更加高效。(这个参数就不用设了,这样就跟Matlab一样都是按列排列)。如果想修改可以在创建矩阵的时候加入参数,如:
Matrix<int,3,4, ColMajor> Acolmajor;
Matrix<int,3,4, RowMajor> Arowmajor
(3)矩阵类型:
Eigen中的矩阵类型一般都是用类似MatrixXXX来表示,可以根据该名字来判断其数据类型,比如”d”表示double类型,”f”表示float类型,”i”表示整数,”c”表示复数;
例如:Matrix2f,表示的是一个2*2维的,其每个元素都是float类型。
Eigen中提供了许多typedefs ,例如Matrix4fd是4*4的double型矩阵:
typedefMatrix<double, 4, 4> Matrix4d;
(4)特殊值Dynamic
当然,Eigen 不局限于在编译时候确定大小的矩阵。模板参数RowsAtCompileTime和ColsAtCompileTime可以传入特殊的值Dynamic ,来标志在编译时大小无法确定,需要当做运行时变量来处理。在中的术语叫做动态大小,与之相应的在编译时确定大小的叫做固定大小。
例如typedef MatrixXd,指的是元素为double,大小为动态的:
typedef Matrix<double,Dynamic, Dynamic> MatrixXd;
类似 typedef VectorXi如下:
typedefMatrix<int, Dynamic, 1> VectorXi;
当然你可以定义一个固定行的,列是动态的float矩阵如下:
Matrix<float,3, Dynamic>
(3)Vectors:
在Eigen中,vectors 只是一种特殊形式的矩阵,有一行或者一列。在大多数情况下一列比较多,这样的向量也叫做列向量,也简称向量。其他情况叫做行向量。
例如typedef Vector3f 是一个(列)向量,它的定义如下:
typedefMatrix<float, 3, 1> Vector3f;
同样我们也提供了行向量的定义:
typedefMatrix<int, 1, 2> RowVector2i;
(未完待续)
扫二维码用手机看