`

矩阵库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
 
分享到:
评论

相关推荐

    C++调用Eigen矩阵运算库技巧的直观理解

    此外,为了优化性能,你可以通过定义`#define EIGEN_USE_MKL_ALL`来利用Intel的MKL数学库,这样Eigen可以更好地与MKL配合,提升矩阵运算速度。 在Eigen中,矩阵的下标是从0开始的,遵循C++的数组访问规则。默认情况...

    C++eigen库和dlib库使用笔记.md

    本文详细介绍了Eigen和Dlib两个C++库的功能和基本操作方法,包括Eigen库的安装、基本矩阵运算、特征值和特征向量计算、矩阵分解等内容,以及Dlib库的安装、图像加载处理、特征提取、人脸检测、支持向量机分类和神经...

    Eigen库的简单实用说明

    本文主要介绍了Eigen库的基本概念和使用方法,包括如何包含头文件、定义不同类型的矩阵、初始化矩阵、获取矩阵信息、矩阵和数组之间的转换以及调整矩阵大小等。通过学习这些基础知识,可以帮助开发人员快速上手并...

    Eigen_Matlab指令对照.pdf

    在Eigen中,我们可以定义固定大小的矩阵和向量,如Matrix3d代表一个3x3的双精度浮点矩阵,而MatrixXd则是一个动态大小的双精度浮点矩阵。 对于矩阵和向量的维度操作,Eigen提供了不同的模板参数来指定行和列的大小...

    eigen库使用方法.zip

    Eigen是一个开源的C++矩阵和向量库,专为数值计算而设计,它在C++环境中提供了高效、灵活且易于使用的线性代数操作。Eigen库适用于各种应用场景,包括机器学习、图像处理、物理模拟等,其核心特性包括模板类、自动...

    C++调用Eigen库技巧的直观理解.docx

    Eigen库提供了多种矩阵和向量类型,如`MatrixXd`用于双精度浮点数的矩阵,`MatrixXcd`用于复数矩阵,`MatrixXf`用于单精度浮点数的矩阵,以及`MatrixXi`用于整数矩阵。向量类型有`VectorXd`、`VectorXcd`、`VectorXf...

    C++调用Eigen库技巧的直观理解 (2).docx

    2. **命名空间**:Eigen库的函数和类定义在`Eigen`命名空间中,所以在使用它们之前,需要通过`using namespace Eigen;`来引入这个命名空间,以便于直接调用其成员。 3. **矩阵和向量的创建**:Eigen支持不同类型的...

    eigen相关接口与基本单元测试

    Eigen库是C++中用于线性代数计算的一个高效、灵活且易于使用的开源库。它提供了丰富的接口,支持向量、矩阵以及更复杂的线性运算。这篇内容将深入探讨Eigen库的基本概念、主要接口和如何进行单元测试。 一、Eigen库...

    EigenC++快速矩阵库的Java包装器_C++_Java_下载.zip

    EigenC++是一个高效且灵活的开源C++矩阵和向量库,主要用于进行数值计算,尤其在处理线性代数问题时表现出色。它提供了一套直观的API,使得程序员能够轻松地进行矩阵运算,如矩阵乘法、求逆、特征值、解线性方程组等...

    椭圆拟合C++函数

    1. 数据结构:MATLAB中的向量和矩阵在C++中可以使用Eigen库来实现。Eigen是一个轻量级、高效的C++模板库,提供了类似于MATLAB的矩阵和向量操作。在C++中,我们需要定义Eigen::Matrix类来存储和操作数据。 2. 矩阵...

    stm32 伟根34/26信号解析

    "伟根"可能是“韦根”的误写,这里指的是Weigen库,可能是一个针对STM32进行数学计算优化的库,尤其是矩阵运算,因为通常在C++中,Eigen库是用来处理高效矩阵和向量操作的。描述中的"26/34"可能是指数据总线宽度,如...

    卡尔曼滤波C++编程

    在C++编程中,我们需要定义卡尔曼滤波器的结构体或类,包括状态向量、系统矩阵、观测矩阵、噪声协方差矩阵等关键元素。例如: ```cpp struct KalmanFilter { Eigen::VectorXd state; Eigen::MatrixXd transition...

    C++程序关键部分.docx

    - `MatrixXd`:Eigen库中的矩阵类型,用于存储数值数据。 - `static MatrixXd Y_ref = MatrixXd::Zero(P, 1);`:参考信号矩阵。 - `static MatrixXd Y_cor = MatrixXd::Zero(P, 1);`:校正后的参考信号矩阵。 - `...

    pinv_M?n_c++奇异值分解_pinv_源码

    在本文中,我们将深入探讨C++编程语言中用于计算矩阵奇异值分解(Singular Value Decomposition, SVD)的方法,并特别关注"pinv",它指的是矩阵的广义逆(pseudoinverse)。奇异值分解是线性代数中的一个核心概念,...

    GN算法C++ 实现

    在C++中实现GN算法,你需要用到一些数值库,比如Eigen库来处理矩阵运算。首先,你需要定义目标函数和雅可比矩阵的计算方法,然后在每次迭代中进行相应的计算。同时,为了提高效率和避免除以零的错误,可能需要使用...

    最小二乘法的C++实现

    在C++中,我们可以使用Eigen库来处理矩阵运算和求逆。首先,确保安装了Eigen库,然后可以按照以下步骤编写代码: ```cpp #include &lt;Eigen/Dense&gt; // 定义设计矩阵X和观测值向量y Eigen::MatrixXd X(data_size, m+...

    三次样条插值

    3. **求解线性方程组**:利用C++中的线性代数库,如Eigen,求解这个线性方程组。这将得到每一段三次多项式的系数。 ```cpp Eigen::MatrixXd buildTridiagonalMatrix(const std::vector&lt;Point&gt;& points); Eigen::...

    PCA.rar_pca

    在这个例子中,我们首先定义了`normalizeData`函数来标准化数据,然后`covarianceMatrix`函数计算协方差矩阵。在`pcaImplementation`函数中,我们进行特征值分解并打印出特征值和对应的特征向量。在`main`函数中,...

    STM32自相关滤波,stm32卡尔曼滤波算法,C,C++源码.zip.zip

    errorCovariance = (Eigen::MatrixXd::Identity(state.rows(), state.cols()) - K * H) * errorCovariance; } ``` 这里的`A`, `B`, `Q`, `H`, `R`分别代表系统矩阵、控制输入矩阵、过程噪声协方差、观测矩阵和测量...

    最小二乘法线性拟合C++

    在C++中,我们可以利用标准模板库(STL)和一些线性代数库(如Eigen库)来实现这个过程。以下是一个简单的C++程序示例,展示了如何进行最小二乘法线性拟合: ```cpp #include #include #include #include &lt;Eigen/...

Global site tag (gtag.js) - Google Analytics