Как транспонировать тензор в собственном

#eigen

#eigen

Вопрос:

Я пытаюсь получить матричное произведение двух тензоров, где один из тензоров должен быть транспонирован до его умножения ( At*B ).

До сих пор то, что я нашел в собственной документации, — это матричный продукт без каких-либо транспонированных и с обеими транспонированными матрицами.

Я ищу способ либо напрямую сжимать два тензора, когда один из тензоров транспонируется, либо путем транспонирования одного тензора перед его сжатием.

Ответ №1:

Я понял это, эффект транспонирования можно выполнить с помощью метода shuffle.

 Eigen::Tensor<int, 2> m(3, 5);
m.setValues(
{
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15}
});

Eigen::array<int, 2> shuffling({1, 0});

Eigen::Tensor<int, 2> transposed = m.shuffle(shuffling);
Eigen::Tensor<int, 2> original = transposed.shuffle(shuffling);
  

Ответ №2:

Вы также можете использовать сокращение напрямую:

 Eigen::Tensor<int, 2> A(3, 5);
Eigen::Tensor<int, 2> B(3, 5);
Eigen::array<int, 1> contraction_indices;
// This will contract the first dimension of A with the first dim of B,
// effectively computing At*B
contraction_indices[0] = {0, 0};
Eigen::Tensor<int, 2> Result = A.contract(B, contraction_indices);