首页 关于
树枝想去撕裂天空 / 却只戳了几个微小的窟窿 / 它透出天外的光亮 / 人们把它叫做月亮和星星
目录

7. C/C++原生数组(raw buffer)的接口:Map类

本章介绍操作C/C++原生数组的方法。这是一个十分有用的接口,它可以方便把其余库函数的矩阵或者向量导入到Eigen中。 很多时候,我们拿到的数据就是一个原生的C/C++数组,却很想用Eigen的Vector或者Matrix做运算。 虽然简单地把数据拷贝一遍构造一个Eigen的对象就可以了,但是这样带来了不必要的时间和空间上的开支。 大多数情况下,我们更希望能够以Eigen中的数据类型复用原来的内存,幸运的是,Eigen提供了Map类可以满足我们这一需求。

7.1 Map类型与变量声明

Map的类型定义如下:

        Map<Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>> 

构建一个Map变量,我们需要三个要素:

  1. 作为Map对象模板参数的类型
  2. 指向转换数组的指针
  3. Matrix或者Vector的大小

例如构建一个在运行时确定大小的Matrix,需要如下的语句实现:

        Map<MatrixXf> mf(pf, rows, columns);

其中,pf是一个指向数组内存的float型指针。一个只读的编译时确定大小的Vector,可以按如下的方法实现:

        Map<const Vector4i> mi(pi);

其中,pi是一个int型指针。在这个例子中并没有把Vector的大小作为构造函数的参数,因为Vector4i已经确定了Vector的大小。

Map提供了灵活的构造方法,可以容纳各种不同的数据表示方式。 它还有两个可选的模板参数:

        Map<typename MatrixType,
            int MapOptions,
            typename StrideType> 

其中,MapOptions声明了指针是Aligned还是Unaligned,默认是Unaligned。 StrideType什么用没看明白。

        #include <iostream>
        #include <Eigen/Dense>

        using namespace std;
        using namespace Eigen;
        int main()
        {
            int array[8];
            for (int i = 0; i < 8; i++)
                array[i] = i;

            cout << "Column-major:" << endl;
            cout << Map<Matrix<int, 2, 4> >(array) << endl;
            cout << "Row-major:" << endl;
            cout << Map<Matrix<int, 2, 4, RowMajor> >(array) << endl;
        } 

需要注意的是,Map并没有默认的构造函数,我们必须传递一个指针用来初始化对象。

7.2 使用Map变量




Copyright @ 高乙超. All Rights Reserved. 京ICP备16033081号-1