Eigen默认采用列主导(column major)的数据存储形式,这点和FORTRAN还有MATLAB是一样的,当然也可以选择采用行主导,但是我感觉真心没必要。我一开始比较关心的是Eigen是否定义了比较方便的额slicing操作。但是似乎Eigen的Slicing和我理解的不太一样,有点复杂。Eigen的文档中,Slicing和Reshape是一起讲的,原因在于他们都是利用Eigen定义的Map功能实现的。
简单理解Map就是将原始“连续内存存储”的数据,以矩阵形式重新组织。在使用Map时就需要原始数据,Map后的数据的维度形式,Map时使用的Stride设定。所谓Stride,既指矩阵中沿着矩阵列或行方向移动一个位置,内存中需要移动的位置数。这个需要移动的内存位置数与矩阵采用的存储方式有关(列或行主导)。Eigen定义了常用的Stride,既innerStride和outerStride。最好理解以上两个stride的方法就是看实例。innerStride既表示沿着矩阵的数据存储方向移动一个元素的位置,在内存中需要移动的宽度。outerStride的含义就是不沿着数据存储方向移动一个位置,在内存中需要移动的宽度。还是用实例进行说明。
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
void run_eigen_test2()
{
MatrixXf M1 = MatrixXf::Random(3, 8);
cout << "Column major input:" << endl << M1 << "\n";
cout << "M1.outerStride() = " << M1.outerStride() << endl;
cout << "M1.innerStride() = " << M1.innerStride() << endl;
Map<MatrixXf, 0, OuterStride<> > M2(
M1.data(), M1.rows(), (M1.cols() + 2) / 3, OuterStride<>(M1.outerStride() * 3));
cout << "1 column over 3:" << endl << M2 << "\n";
//最经常用的就是取出一行或者一列的操作
cout << "Column major input:" << endl << M1 << "\n";
cout << "The first column is:" << endl << M1.col(0) << "\n";
cout << "The last column is: " << endl << M1.rightCols(1) << "\n";
cout << "The first row is: " << endl << M1.topRows<1>() << endl;
cout << "The last row is: " << endl << M1.bottomRows<1>() << endl;
}
参考:https://blog.csdn.net/huyaoyu/article/details/78454249