这一节主要是解释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。