Тензорное сжатие, как выбрать индексы, по которым следует сокращаться? - PullRequest
0 голосов
/ 25 февраля 2019

Я хотел бы выполнить простые Tensorcontractions с модулем Eigen :: Tensor, но до сих пор я не понимаю, как вы обращаетесь к правильным размерам.

Вот мой текущий код:

Eigen::Tensor<double, 3> B(3,4,3); B.setRandom();
Eigen::Tensor<double, 3> C(3,4,3); C.setRandom();

// Eigen::array<Eigen::IndexList<int,int,int>,1> idx = 
//                      {Eigen::IndexList<int,int,int>(1,0,0)}; 
//                       also does not seem to be the way
Eigen::array<int,3> idx({0,0,1});
Eigen::Tensor<double, 4> D = B.contract(C, idx);

Я просто хотел бы заключить контракт по последнему измерению B и первому измерению C .Но я не понимаю, как работает система, и в документации приведен только пример для 2D-тензоров.

//the first element of IDXPair is the choosen index in B and the second the idx for C
Eigen::array<Eigen::IndexPair<int>,1> idx = {Eigen::IndexPair<int>(2,0)};

Здесь второй индекс будет умножен на ноль второго тензора.

1 Ответ

0 голосов
/ 25 февраля 2019

IndexPair означает именно то, что говорит: первый индекс в тензорных измерениях сопоставляется со вторым индексом во втором тензорном.

IdxPair (a, b) => A (1,2, 3,4, x) * B (x, 5,6,7,8,9) где a - индекс последнего измерения, в этом случае x и b - индекс измерения во втором тензоре

...