天天看点

Eigen库学习(八)Map类与原始类型交互

这一节主要是解释Eigen是如何与原始的C/C++内存进行交互的,在很多场合是非常有用的,如从外部库输入vector和matrix到Eigen。

一、简介

有时候你可能有一个已经初始化了数组数据,但是你又想用Eigen库的计算功能,你有两种选择,要么拷贝,要么复用。Eigen将提供一个Map类来完成后者。

二、Map类及Map变量定义

Map类模板参数与Matrix前三个一样:

不过默认情况下只需要一个模板参数。为了构造这个Map变量,你需要提供两个信息:

  • 一个指向矩阵系数的参数
  • 矩阵、向量的形状

比如:

这里pf是指向一个float 的数组指针。如果你想使用fixed大小的Map,则应该这么定义:

pi是一个指向int的数组指针。

三、Map变量使用

下面这个例子是展示如何与Matrix进行内存共享。

typedef Matrix<float,1,Dynamic> MatrixType;
typedef Map<MatrixType> MapType;
typedef Map<const MatrixType> MapTypeConst;   // a read-only map
const int n_dims = 5;
  
MatrixType m1(n_dims), m2(n_dims);
m1.setRandom();
m2.setRandom();
float *p = &m2(0);  // get the address storing the data for m2
MapType m2map(p,m2.size());   // m2map shares data with m2
MapTypeConst m2mapconst(p,m2.size());  // a read-only accessor for m2
 
cout << "m1: " << m1 << endl;
cout << "m2: " << m2 << endl;
cout << "Squared euclidean distance: " << (m1-m2).squaredNorm() << endl;
cout << "Squared euclidean distance, using map: " <<
  (m1-m2map).squaredNorm() << endl;
m2map(3) = 7;   // this will change m2, since they share the same array
cout << "Updated m2: " << m2 << endl;
cout << "m2 coefficient 2, constant accessor: " << m2mapconst(2) << endl;
/* m2mapconst(2) = 5; */   // this yields a compile-time error
           

四、改变已经被mapped的数组

int data[] = {1,2,3,4,5,6,7,8,9};
Map<RowVectorXi> v(data,4);
cout << "The mapped vector v is: " << v << "\n";
new (&v) Map<RowVectorXi>(data+4,5);
cout << "Now v is: " << v << "\n";
           

这个做法不会引起内存的分配,因为给定了起始地址data。