Eigen :: Тензорное двойное сжатие к скалярному значению

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

Eigen::TensorContractionOp<const std::array<Eigen::IndexPair<int>, 2ul>, const Eigen::TensorFixedSize<double, Eigen::Sizes<3l, 3l> >, const Eigen::TensorFixedSize<double, Eigen::Sizes<3l, 3l> > >

но мне нужен double, Я могу распечатать его, но я не могу с ним работать.

Код следующий

#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>

int main()
{

auto tensor1 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor1.setValues({ {1, 0, 0},
{0, 1, 0},
{0, 0, 1} });
std::cout << "tensor1:\n" << tensor1 << "\n";

auto tensor2 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor2.setValues({ {2, 0, 0},
{0, 2, 0},
{0, 0, 2} });
std::cout << "tensor2:\n" << tensor2 << "\n";

Eigen::array<Eigen::IndexPair<int>, 2> contraction_pair0011
= { Eigen::IndexPair<int>(0, 0), Eigen::IndexPair<int>(1, 1)};

auto tensor1_tensor2 = tensor1.contract(tensor2, contraction_pair0011);
std::cout << "tensor1 : tensor2:\n" << tensor1_tensor2 << "\n";

// double value = tensor1_tensor2; // won't compile

}

Мне нужна функция или вызов, чтобы получить значение результата, надеюсь, кто-нибудь может мне помочь.

Ура Джонас

0

Решение

Я решил проблему, но думаю, что она вам тоже поможет, если вы работаете с модулем Eigen :: Tensor.

Как написано Вот в разделе Тензор Операций и С ++ «Авто»:

Поскольку тензорные операции создают тензорные операторы, C ++ auto Ключевое слово не имеет своего интуитивного значения. Когда вы используете auto в результате вы получаете не тензор, а выражение без оценки …

Таким образом, результатом тензорного сжатия является

Eigen::TensorContractionOp<...>

а не тензор, из которого мы можем получить его элементы. Итак, нам нужно знать размер результирующего тензора. Проблема была в том, что результатом должен быть скалярный тензор, который делается с пустым Eigen::Sizes<>

Eigen::TensorFixedSize<double, Eigen::Sizes<>>

Здесь бегущий код. Надеюсь, это кому-нибудь поможет …

#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>

int main()
{
auto tensor1 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor1.setValues({ {1, 0, 0},
{0, 1, 0},
{0, 0, 1} });
std::cout << "tensor1:\n" << tensor1 << "\n";

auto tensor2 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor2.setValues({ {2, 0, 0},
{0, 2, 0},
{0, 0, 2} });
std::cout << "tensor2:\n" << tensor2 << "\n";Eigen::array<Eigen::IndexPair<int>, 2> contraction_pair0011
= { Eigen::IndexPair<int>(0, 0), Eigen::IndexPair<int>(1, 1)};

Eigen::TensorFixedSize<double, Eigen::Sizes<>> tensor1_tensor2 = tensor1.contract(tensor2, contraction_pair0011);
std::cout << "tensor1 : tensor1:\n" << tensor1_tensor2 << "\n";

double t1_t2 = tensor1_tensor2(0);
std::cout << "result in double:\n" << t1_t2 << "\n";
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]