`

矩阵库Eigen的MatrixXd中预定义的类型

c++ 
阅读更多
在使用Eigen编程时,到处是Curiously recurring template pattern,那么,我们如何知道一个矩阵中存的是double型变量还是float型的变量呢?
有人会说, MatrixXd中存的就是double型变量MatrixXf中存的是float型变量啊!


我是无耻的插队者:不了解Curiously recurring template pattern的可以看我之前的文章:http://cherishlc.iteye.com/blog/1994276

可是,如果一个泛型函数是如下定义的,我们如何知道X中存的是什么类型的变量呢?
template <typename Derived> void cov(const MatrixBase<Derived>& X){}


先说一下这样写的好处
  • 1、通用性强,X既可以是MatrixXd类型的,也可以是MatrixXf类型的,甚至是矩阵的一个子块m1.block(0,0,10,10)的 或者表达式 m1+m2  (假设m1,m2为MatrixXd类型的)
  • 2、速度快(表达式类型不用先进行运算,存为Matrix了)


但是,事物都有其两面性。。。
问题来了:如果再写函数的过程中,我们需要声明一个临时变量,与X中存储的元素类型相同,该如何声明?
答案很简单,Eigen在MatrixBase类(事实上是近乎所有类)中为我们定义了这些类型,
类型列表如下:
  • Scalar: 矩阵中存储的类型
  • Index:   矩阵下标的类型,貌似为unsigned int型的
  • PlainObject: 表达式对应的矩阵类型,  比如m1+m2对应的PlainObject为 m1的类型,即decltype(m1)


使用的时候,用如下语句可以声明一个变量s:

typename Derived::Scalar s;


好了,最后来膜拜一下PlainObject的定义:
typedef Matrix<typename internal::traits<Derived>::Scalar, internal::traits<Derived>::RowsAtCompileTime, internal::traits<Derived>::ColsAtCompileTime, AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor), internal::traits<Derived>::MaxRowsAtCompileTime, internal::traits<Derived>::MaxColsAtCompileTime > PlainObject


还有些简单的:
typedef typename internal::traits<Derived>::Index Index;
typedef typename internal::traits<Derived>::Scalar Scalar;
typedef typename NumTraits<Scalar>::Real RealScalar;


可能有些人还会有疑问,为何是internal::traits<Derived>::Scalar  而不是Derived::Scalar(事实上我们用的时候可以这么用,但是在写Eigen库的过程中不行)!!原因是在编写Eigen库的过程中,类型相互引用,会产生类型未定义的问题(大致如此,描述可能不准确),这样的问题,我们作为库的使用者是不会遇到的
摘录Eigen官方文档如下:

引用
Let us now explain the internal::traits here. The internal::scalar_sum_op class takes one template parameter: the type of the numbers to handle. Here of course we want to pass the scalar type (a.k.a. numeric type) of VectorXf, which is float. How do we determine which is the scalar type of Derived ? Throughout Eigen, all matrix and expression types define a typedef Scalar which gives its scalar type. For example, VectorXf::Scalar is a typedef for float. So here, if life was easy, we could find the numeric type of Derived as just

typename Derived::Scalar
Unfortunately, we can't do that here, as the compiler would complain that the type Derived hasn't yet been defined. So we use a workaround: in src/Core/util/ForwardDeclarations.h, we declared (not defined!) all our subclasses, like Matrix, and we also declared the following class template:

template<typename T> struct internal::traits;
In src/Core/Matrix.h, right before the definition of class Matrix, we define a partial specialization of internal::traits for T=Matrix<any template parameters>. In this specialization of internal::traits, we define the Scalar typedef. So when we actually define Matrix, it is legal to refer to "typename internal::traits\<Matrix\>::Scalar".




Matrix类官方文档:
http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html

MatrixBase类官方文档:
http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#ac33495a0e3788e5951670c392b44d9ad

编写Eigen的泛型函数:
http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html

关于internal::traits的,这篇对理解Eigen架构很有帮助:
http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html
 
分享到:
评论

相关推荐

    实用矩阵库 eigen

    实用矩阵库 eigen 强大且只需要头文件即可 实用矩阵库 eigen 强大且只需要头文件即可 实用矩阵库 eigen 强大且只需要头文件即可

    C++矩阵库 Eigen 快速入门

    近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了。 Eigen 是一个基于C++模板的线性代数库,直接将库下载后放在项目目录下,...

    矩阵库eigen3

    矩阵库eigen 3,不用安装,简便易用

    矩阵库Eigen

    矩阵库Eigen,本人亲测在VS2010中运行良好,只需要在项目中包含文件的路径就可以正常使用了

    开源矩阵运算库eigen

    可以源码级引用的开源矩阵运算库,适合于多种项目嵌入,使用方便

    EIGEN矩阵库

    C++的矩阵库——EIGEN,通过这个矩阵库,可以很方便的使用matlab的矩阵计算

    Eigen矩阵运算库源代码

    Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库,从3.1.1版本开始遵从MPL2许可。

    矩阵计算 Eigen3依赖库 (3.3.5 Release)

    矩阵计算 Eigen3依赖库 (3.3.5 Release)。Eigen是一个高层次的C++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。该版本是在3.3.5版本中发布的,有效支持需要Eigen 3.2 or later的调用。

    C++ Eigen库计算矩阵特征值及特征向量

    本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较。 C++Eigen库代码 #include #include &lt;Eigen&gt; #include &lt;Eigen&gt; using namespace Eigen; using namespace std; void Eig() { ...

    C++ Eigen库的下载配置和使用

    4.5 特殊矩阵的定义 4.5.1 全0矩阵 4.5.2 全1矩阵 4.5.3 矩阵置0 4.5.4 矩阵置1 4.5.5 随机矩阵 4.5.6 置为单位阵(不一定是方阵) 4.5.7 矩阵填充 4.5.8 将向量转为对角阵 4.6 矩阵运算 4.6.1 矩阵相乘 4.6.2 矩阵...

    网页版eigen中文教程_eigen教程_eigen;矩阵函数库;中文教程_

    eigen中文使用教程,csdn网页版的教程;eigen是矩阵运算函数库,简单易用。

    利用eigen矩阵库求解线性方程组

    c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,...

    最新的eigen库 eigen.rar

    Eigen适用范围广,支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;...Eigen支持多种编译环境,开发人员对库中的实例在多种编译环境下经过测试,以保证其在不同编译环境下的可靠性和实用性。

    EigenDemon_matrix_矩阵运算库_线性代数_数学函数库_eigen_

    Eigen数学函数库中文使用案例,包括矩阵的基本使用、线性代数运算、稀疏矩阵算法以及矩阵的几何算法。

    C++矩阵处理库 Eigen 2017最新源码

    C++矩阵处理库 Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。它的License是MPL2。它支持多平台。

    eigen-eigen-5a0156e40feb.zip_c++ 矩阵_eigen_eigen 库_特征值分解 c++_矩阵特征

    C++矩阵工具库,可以执行矩阵的加减乘除、矩阵的各种分解,矩阵的特征值和特征向量,速度适中

    数学矩阵计算库 EIgen3

    Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。 直接静态调用即可。

    eigen-3.2.7-released矩阵运算库

    非常强大的矩阵运算库,Eigen一个重要特点是没有什么依赖的库,本身仅有许多头文件组成,因此非常轻量而易于跨平台。

    eigen3+vs2017+cmake使用vs2017编译Eigen3库 Eigen3.3.9库

    使用vs2017和cmake编译的Eigen3.3.9的库,32位64位通用

Global site tag (gtag.js) - Google Analytics