Оценка редукции по всем измерениям в классе Eigen3 Tensor

Я пытаюсь вычислить норму Фробениуса тензора, используя модуль Tensor библиотеки Eigen3.

Вот мой код:

#include <unsupported/Eigen/CXX11/Tensor>

int main ()
{
  Eigen::Tensor<double, 3> t(4, 3, 2);
  t.setRandom();

  // Computing the Frobenius norm. The result is a single scalar value.
  const auto frob_norm_op = t.square().sum().sqrt().eval();

  // Is there an easier way to extract the scalar value ?
  Eigen::TensorEvaluator<const decltype(frob_norm_op), Eigen::DefaultDevice>
    frob_norm_eval (frob_norm_op, Eigen::DefaultDevice());
  const double frob_norm = frob_norm_eval.coeff(0);

  return 0;
}

Это работает, но я предполагаю, что должен быть более простой способ извлечь frob_norm из frob_norm_op. Любые идеи?

Пример документации вызывает ошибку времени выполнения.


person Pablo Antolín    schedule 28.06.2016    source источник


Ответы (1)


сам отвечаю. Я не знаю, лучший ли это способ, но он лучше предыдущего:

#include <unsupported/Eigen/CXX11/Tensor>

int main ()
{
  Eigen::Tensor<double, 3> t(4, 3, 2);
  t.setRandom();

  const Eigen::Tensor<double, 0> frob_norm_tens = t.square().sum().sqrt();
  const double frob_norm = frob_norm_tens.coeff();

  return 0;
}
person Pablo Antolín    schedule 29.06.2016