Eigen::Tensor, как получить доступ к матрице из Tensor

У меня есть следующий собственный тензор:

Eigen::Tensor<float, 3> m(3,10,10);

Я хочу получить доступ к 1-й матрице. В numpy я бы сделал это как таковой

m(0,:,:)

Как бы я сделал это в Eigen


person raaj    schedule 06.02.2018    source источник
comment
Обычно я не работаю с тензорами в eigen, но вот найденная мной документация, которая может помочь: github.com/RLovelett/eigen/tree/master/unsupported/Eigen/CXX11/. Здесь также есть обходной путь для использования матриц вместо тензоров, когда размеры › 2: rel="nofollow noreferrer">studywolf.wordpress.com/2012/09/16/n-diversity-matrix-in-c. Удачи   -  person rmilletich    schedule 06.02.2018
comment
Я просмотрел весь документ. Нет никакой ссылки на то, как получить доступ к блоку/матрице трехмерного тензора.   -  person raaj    schedule 06.02.2018
comment
Возможно, вам придется создать свое собственное уникальное решение, как в другом посте stackoverflow... вот некоторые другие обходные пути с использованием типа MatrixXd: for-build-3d-structures-using-eigen-matrices" title="наиболее эффективный вариант построения 3d-структур с использованием собственных матриц"> stackoverflow.com/questions/17098218/.   -  person rmilletich    schedule 06.02.2018
comment
Кстати, если вам нравится numpy, посмотрите библиотеку xtensor для c++, если у вас есть время. API очень похож на numpy, и вы можете получить доступ к многомерным массивам, подобным numpy.   -  person rmilletich    schedule 06.02.2018
comment
эта библиотека быстрая?   -  person raaj    schedule 07.02.2018


Ответы (1)


Вы можете получить доступ к частям тензора, используя .slice(...) или .chip(...). Сделайте это, чтобы получить доступ к первой матрице, эквивалентной numpy m(0,:,:):

Eigen::Tensor<double,3> m(3,10,10);          //Initialize
m.setRandom();                               //Set random values 
std::array<long,3> offset = {0,0,0};         //Starting point
std::array<long,3> extent = {1,10,10};       //Finish point
std::array<long,2> shape2 = {10,10};         //Shape of desired rank-2 tensor (matrix)
std::cout <<  m.slice(offset, extent).reshape(shape2) << std::endl;  //Extract slice and reshape it into a 10x10 matrix.

Если вам нужна вторая матрица, вы используете вместо нее offset={1,0,0} и так далее.

Вы можете найти самую последнюю документацию здесь.

person DavidAce    schedule 02.03.2018
comment
Пока он печатает, m.slice(offset, extent).reshape(shape2) не возвращает тип собственной матрицы. - person Madeleine P. Vincent; 01.05.2021