特色技术

专业从事预应力结构体系的设计、施工一体化解决方案

资讯分类

线性代数计算库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;

  (未完待续)

扫二维码用手机看