Eigen的使用总结3——Map类

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 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值