diff --git a/Eigen/src/Householder/HouseholderSequence.h b/Eigen/src/Householder/HouseholderSequence.h index 61a8e8c1d..f8ae4136b 100644 --- a/Eigen/src/Householder/HouseholderSequence.h +++ b/Eigen/src/Householder/HouseholderSequence.h @@ -88,13 +88,28 @@ struct ei_hseq_side_dependent_impl } }; +template struct ei_matrix_type_times_scalar_type +{ + typedef typename ei_scalar_product_traits::ReturnType + ResultScalar; + typedef Matrix Type; +}; + template class HouseholderSequence : public AnyMatrixBase > { - typedef typename VectorsType::Scalar Scalar; + enum { + RowsAtCompileTime = ei_traits::RowsAtCompileTime, + ColsAtCompileTime = ei_traits::ColsAtCompileTime, + MaxRowsAtCompileTime = ei_traits::MaxRowsAtCompileTime, + MaxColsAtCompileTime = ei_traits::MaxColsAtCompileTime + }; + typedef typename ei_traits::Scalar Scalar; + typedef typename ei_hseq_side_dependent_impl::EssentialVectorType EssentialVectorType; - + public: typedef HouseholderSequence< @@ -179,17 +194,19 @@ template class HouseholderS } template - typename OtherDerived::PlainMatrixType operator*(const MatrixBase& other) const + typename ei_matrix_type_times_scalar_type::Type operator*(const MatrixBase& other) const { - typename OtherDerived::PlainMatrixType res(other); + typename ei_matrix_type_times_scalar_type::Type + res(other.template cast::ResultScalar>()); applyThisOnTheLeft(res); return res; } template friend - typename OtherDerived::PlainMatrixType operator*(const MatrixBase& other, const HouseholderSequence& h) + typename ei_matrix_type_times_scalar_type::Type operator*(const MatrixBase& other, const HouseholderSequence& h) { - typename OtherDerived::PlainMatrixType res(other); + typename ei_matrix_type_times_scalar_type::Type + res(other.template cast::ResultScalar>()); h.applyThisOnTheRight(res); return res; } diff --git a/test/upperbidiagonalization.cpp b/test/upperbidiagonalization.cpp index e6f66a2d5..f64c1aed0 100644 --- a/test/upperbidiagonalization.cpp +++ b/test/upperbidiagonalization.cpp @@ -24,7 +24,6 @@ #include "main.h" #include -#include template void upperbidiag(const MatrixType& m) { @@ -39,7 +38,7 @@ template void upperbidiag(const MatrixType& m) RealMatrixType b(rows, cols); b.setZero(); b.block(0,0,cols,cols) = ubd.bidiagonal(); - MatrixType c = ubd.householderU() * b.template cast() * ubd.householderV().adjoint(); + MatrixType c = ubd.householderU() * b * ubd.householderV().adjoint(); VERIFY_IS_APPROX(a,c); }