diff options
author | 2010-11-10 18:58:55 +0100 | |
---|---|---|
committer | 2010-11-10 18:58:55 +0100 | |
commit | 2577ef90c027d8bad4dd632022fa65cec6313159 (patch) | |
tree | 69b63c743bcc79daa4af6ab7df29c3dac6e1e034 /Eigen/src/Core/TriangularMatrix.h | |
parent | c810d14d4d595f6a9e748f625ddb419bb91b8262 (diff) |
generalize our internal rank K update routine to support more general A*B product while evaluating only one triangular part and make it available via, e.g.:
R.triangularView<Lower>() += s * A * B;
Diffstat (limited to 'Eigen/src/Core/TriangularMatrix.h')
-rw-r--r-- | Eigen/src/Core/TriangularMatrix.h | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/Eigen/src/Core/TriangularMatrix.h b/Eigen/src/Core/TriangularMatrix.h index e361af643..ba0f2741e 100644 --- a/Eigen/src/Core/TriangularMatrix.h +++ b/Eigen/src/Core/TriangularMatrix.h @@ -189,9 +189,9 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView inline Index innerStride() const { return m_matrix.innerStride(); } /** \sa MatrixBase::operator+=() */ - template<typename Other> TriangularView& operator+=(const Other& other) { return *this = m_matrix + other; } + template<typename Other> TriangularView& operator+=(const DenseBase<Other>& other) { return *this = m_matrix + other.derived(); } /** \sa MatrixBase::operator-=() */ - template<typename Other> TriangularView& operator-=(const Other& other) { return *this = m_matrix - other; } + template<typename Other> TriangularView& operator-=(const DenseBase<Other>& other) { return *this = m_matrix - other.derived(); } /** \sa MatrixBase::operator*=() */ TriangularView& operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix * other; } /** \sa MatrixBase::operator/=() */ @@ -292,7 +292,6 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView (lhs.derived(),rhs.m_matrix); } - template<int Side, typename OtherDerived> typename internal::plain_matrix_type_column_major<OtherDerived>::type solve(const MatrixBase<OtherDerived>& other) const; @@ -341,8 +340,51 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView else return m_matrix.diagonal().prod(); } - + + // TODO simplify the following: + template<typename ProductDerived, typename Lhs, typename Rhs> + EIGEN_STRONG_INLINE TriangularView& operator=(const ProductBase<ProductDerived, Lhs,Rhs>& other) + { + setZero(); + return assignProduct(other,1); + } + + template<typename ProductDerived, typename Lhs, typename Rhs> + EIGEN_STRONG_INLINE TriangularView& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other) + { + return assignProduct(other,1); + } + + template<typename ProductDerived, typename Lhs, typename Rhs> + EIGEN_STRONG_INLINE TriangularView& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other) + { + return assignProduct(other,-1); + } + + + template<typename ProductDerived> + EIGEN_STRONG_INLINE TriangularView& operator=(const ScaledProduct<ProductDerived>& other) + { + setZero(); + return assignProduct(other,other.alpha()); + } + + template<typename ProductDerived> + EIGEN_STRONG_INLINE TriangularView& operator+=(const ScaledProduct<ProductDerived>& other) + { + return assignProduct(other,other.alpha()); + } + + template<typename ProductDerived> + EIGEN_STRONG_INLINE TriangularView& operator-=(const ScaledProduct<ProductDerived>& other) + { + return assignProduct(other,-other.alpha()); + } + protected: + + template<typename ProductDerived, typename Lhs, typename Rhs> + EIGEN_STRONG_INLINE TriangularView& assignProduct(const ProductBase<ProductDerived, Lhs,Rhs>& prod, const Scalar& alpha); const MatrixTypeNested m_matrix; }; |