Eigen3 张量切片而不复制数据

Jdl*_*lCR 5 eigen eigen3

我一直在为一个新项目测试 Eigen3 的 Tensor 模块。即使模块尚未完成,它似乎也具有我需要的大部分功能。

但有一个部分我不太明白。每当我有一个很大的 Tensor 并且我想从中提取一个切片时,Eigen 都会复制数据。

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

例如,如果我这样做:

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;
Run Code Online (Sandbox Code Playgroud)

但是“c”的第一个元素仍然为零,而不是映射到修改后的“A(0,0,0)”数据块。

Joh*_*ang 1

您可以使用 TensorMap 基于切片的共享内存空间创建张量。然而,只有当您的切片占据数据数组的连续部分时,这才有效。否则,您将需要进行一些张量算术来计算出单个切片各个部分的开始和结束一维索引。

TensorMap<Tensor<float, 3, RowMajor> > row_major(data, ...);
Run Code Online (Sandbox Code Playgroud)