Произведение между двумя собственными матрицами динамического размера пользовательских скалярных типов - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть два настроенных скалярных типа T и S.Я перегрузил матричный продукт operator* между собственной матрицей T и S, как предложено в Смешивание скалярных типов в Eigen

template <typename MatrixL, typename MatrixR>
typename std::enable<(std::is_same<MatrixL::Scalar, T>::value && std::is_same<MatrixR::Scalar,S>::value) || (std::is_same<MatrixR::Scalar, T>::value && std::is_same<MatrixL::Scalar, S>::value), Eigen::Matrix<T, MatrixL::RowsAtCompileTime, MatrixR::ColsAtCompileTime>::type
operator*(const MatrixL& lhs, const MatrixR& rhs) {
  return lhs.template cast<T>() * rhs.template cast<T>();
}

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

Eigen::Matrix<T, 2, 2> T_static;
Eigen::Matrix<T, Dynamic, Dynamic> T_dynamic(2, 2);
Eigen::Matrix<S, 2, 2> S_static;
Eigen::Matrix<S, Dynamic, Dynamic> S_dynamic(2, 2);
T_static * S_static;    // works
T_static * S_dynamic;   // works
T_dynamic * S_static;   // works
T_dynamic * S_dynamic;  // compilation error

Полученная ошибка выглядит следующим образом:

external/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h:435:28: note:   template argument deduction/substitution failed:
external/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h:1413:13: note:   deduced conflicting types for parameter 'AccPacketType' ('drake::symbolic::RationalFunction' and 'Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::RhsPacket {aka drake::symbolic::Polynomial}')
             EIGEN_GEBGP_ONESTEP(6);
             ^
external/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h:1413:13: error: no matching function for call to 'Eigen::internal::gebp_traits<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, false, false>::madd(Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::LhsPacket&, Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::RhsPacket&, Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::AccPacket&, Eigen::internal::gebp_kernel<drake::symbolic::RationalFunction, drake::symbolic::Polynomial, long int, Eigen::internal::blas_data_mapper<drake::symbolic::RationalFunction, long int, 0, 0>, 2, 4, false, false>::RhsPacket&)'
             EIGEN_GEBGP_ONESTEP(6);

, где drake::symbolic::Polynomial - это тип S, иdrake::symbolic::RationalFunction это тип T.Я использую llvm-4.0 на машине с Ubuntu 16.04.

...