diff options
author | Gael Guennebaud <g.gael@free.fr> | 2011-01-27 09:59:19 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2011-01-27 09:59:19 +0100 |
commit | 0bfb78c8240525a8065e008efad08498d572ef81 (patch) | |
tree | 0f899ed3e3dceb9bfc2b1d356178a83d2999510f /Eigen/src/Core/Dot.h | |
parent | fe3bb545e0a1a1cfaf36f6e25a5cc0bfb00337c6 (diff) |
allow mixed complex-real and real-complex dot products
Diffstat (limited to 'Eigen/src/Core/Dot.h')
-rw-r--r-- | Eigen/src/Core/Dot.h | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/Eigen/src/Core/Dot.h b/Eigen/src/Core/Dot.h index 16496273c..0d8856efa 100644 --- a/Eigen/src/Core/Dot.h +++ b/Eigen/src/Core/Dot.h @@ -41,18 +41,20 @@ template<typename T, typename U, > struct dot_nocheck { - static inline typename traits<T>::Scalar run(const MatrixBase<T>& a, const MatrixBase<U>& b) + typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar; + static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b) { - return a.template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar> >(b).sum(); + return a.template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum(); } }; template<typename T, typename U> struct dot_nocheck<T, U, true> { - static inline typename traits<T>::Scalar run(const MatrixBase<T>& a, const MatrixBase<U>& b) + typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar; + static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b) { - return a.transpose().template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar> >(b).sum(); + return a.transpose().template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum(); } }; @@ -70,14 +72,14 @@ struct dot_nocheck<T, U, true> */ template<typename Derived> template<typename OtherDerived> -typename internal::traits<Derived>::Scalar +typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType MatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived) - EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value), - YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) + typedef internal::scalar_conj_product_op<Scalar,typename OtherDerived::Scalar> func; + EIGEN_CHECK_BINARY_COMPATIBILIY(func,Scalar,typename OtherDerived::Scalar); eigen_assert(size() == other.size()); |