我一直在为一个新项目测试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;
但是“ c”的第一个元素仍然为零,而不是映射到修改后的“ A(0,0,0)”数据块。
答案 0 :(得分:0)
您可以使用TensorMap基于切片的共享内存空间创建张量。但是,这仅在您的分片占用数据数组的连续部分时才有效。否则,您将需要执行一些张量算法来找出单个切片的各个部分的开始和结束1d索引。
TensorMap<Tensor<float, 3, RowMajor> > row_major(data, ...);