Eigen 不复制数据的特征3张量切片

Eigen 不复制数据的特征3张量切片,eigen,eigen3,Eigen,Eigen3,我一直在为一个新项目测试来自Egeng3的张量模块。 即使模块还没有完成,它似乎拥有我所需要的大部分功能 但有一部分我不太明白。每当我有一个大张量,我想从中提取一个切片,艾根就会复制数据 有没有办法不复制数据,而是指向切片中的原始数据块 例如,如果我这样做: Tensor<float, 3> A(100,1000,1000); A.setZero(); Eigen::array<int, 3> offsets = {0, 0, 0}; Eigen::array<i

我一直在为一个新项目测试来自Egeng3的张量模块。 即使模块还没有完成,它似乎拥有我所需要的大部分功能

但有一部分我不太明白。每当我有一个大张量,我想从中提取一个切片,艾根就会复制数据

有没有办法不复制数据,而是指向切片中的原始数据块

例如,如果我这样做:

Tensor<float, 3> A(100,1000,1000); A.setZero();

Eigen::array<int, 3> offsets = {0, 0, 0};
Eigen::array<int, 3> extents = {2, 2, 2};

Tensor<float, 3> c = A.slice(offsets, extents);
A(0,0,0) = 1.0;

cerr << c << endl;
张量A(10010001000);A.设置零();
特征::数组偏移量={0,0,0};
特征::数组范围={2,2,2};
张量c=A.slice(偏移量、范围);
A(0,0,0)=1.0;

cerr您可以使用TensorMap根据片的共享内存空间创建张量。但是,这仅在片占用数据数组的连续部分时有效。否则,您将需要执行一些张量算法来计算单个切片各个部分的开始和结束1d索引

TensorMap<Tensor<float, 3, RowMajor> > row_major(data, ...);
TensorMap行(数据,…);

可能是一种选择。不过,这个实现看起来效率很低(使用动态多态性)。谢谢您的回答。我知道Blitz++是有可能的,它(很遗憾)在我的测试中不如Eigen3在数组操作中的效率选项?使用“auto”似乎保留了对原始块的引用,但我不能在“c”中使用括号运算符。所以我可以把c打印成一个矩阵,我怀疑每次我调用err时它都在a中复制数据块