Eigen: странное поведение операторов тензорного умножения

Я хотел бы использовать тензорный класс Эйгена.
Я установил Eigen 3.3.3 и убедился, что мой проект выбирает правильную версию (не более старый пакет ubuntu)

cout<<EIGEN_WORLD_VERSION<<"."<<EIGEN_MAJOR_VERSION<<"."<<EIGEN_MINOR_VERSION<<endl;

// prints 3.3.3

Этот код работает:

Tensor<double, 3> t(3,3,3);
t.setConstant(1);

Но этот код не работает:

t*=5;

Сообщение об ошибке жалуется на int тип:

[ 50%] Building CXX object CMakeFiles/sandbox.dir/src/SandBox/sandbox.cpp.o
In file included from /opt/eigen333/include/eigen3/unsupported/Eigen/CXX11/Tensor:103:0,
from /home/lars/programming/fsd_cpp/src/SandBox/sandbox.cpp:3:
/opt/eigen333/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h: In instantiation of ‘Derived& Eigen::TensorBase<Derived, AccessLevel>::operator*=(const OtherDerived&) [with OtherDerived = int; Derived = Eigen::Tensor<double, 3>; int AccessLevel = 1]’:
/home/lars/programming/fsd_cpp/src/SandBox/sandbox.cpp:30:6:   required from here
/opt/eigen333/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h:876:36: error: request for member ‘derived’ in ‘other’, which is of non-class type ‘const int’
return derived() = derived() * other.derived();

я пробовал t*=5.; но это только изменяет сообщение об ошибке на which is of non-class type ‘const double’

Когда я изменяю код на:

t=t*5;

Сообщение об ошибке становится довольно длинным: https://pastebin.com/T6kvLaZ9

И финальная версия:

t=t*5.;

Удивительно, но это работает. Я не понимаю, почему t*=5.; выдает ошибку.

1

Решение

Как уже упоминалось, скалярное умножение с использованием * Оператор в настоящее время не поддерживается Eigen Tensors. Поэлементное тензорное умножение, однако, есть. Чтобы скалярно умножить тензор, используйте команду t.constant(Scalar) создать тензор, идентичный по размерам t но со всеми элементами, равными значению Scalar, предоставлена Scalar это тип float, Затем используйте * Оператор умножить на этот Тензор:

Tensor<double, 3> t(5,5);
t.setConstant(1);

Tensor<double, 3> ans(5,5) = t*t.constant(5.);
std::cout << t << std::endl;
std::endl;
std::cout << ans << std::endl;

производит

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
2

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

Насколько я знаю, текущая реализация Eigen Tensor не поддерживает скалярное умножение.
Но вы можете попробовать конвертировать Тензор в Матрицу.

0

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