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变量,我们需要三个要素:
- 作为Map对象模板参数的类型
- 指向转换数组的指针
- 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并没有默认的构造函数,我们必须传递一个指针用来初始化对象。