Eigen3 тензорные срезы без создания копии данных - PullRequest
0 голосов
/ 15 октября 2018

Я тестировал модуль Tensor от Eigen3 для нового проекта.Даже когда модуль еще не закончен, он, кажется, обладает большей частью необходимой мне функциональности.

Но есть одна часть, которую я совсем не понимаю.Всякий раз, когда у меня есть большой тензор и я хочу извлечь из него срез, Eigen делает копию данных.

Есть ли способ не копировать данные, а вместо этого указать на исходный блок данных вslice?

Например, если я делаю:

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)Блок данных.

1 Ответ

0 голосов
/ 12 января 2019

Вы можете использовать TensorMap для создания тензора, основанного на пространстве общей памяти вашего среза.Однако это работает, только если ваш фрагмент занимает непрерывную часть массива данных.В противном случае вам потребуется выполнить некоторую тензорную арифметику, чтобы вычислить индексы начала и конца 1d различных частей вашего отдельного среза.

TensorMap<Tensor<float, 3, RowMajor> > row_major(data, ...);
...