mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-12 17:33:15 +08:00
Add evaluator shortcut for triangular ?= product
This commit is contained in:
parent
8169c6ac59
commit
5b78780def
@ -233,6 +233,24 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView
|
|||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline Index innerStride() const { return m_matrix.innerStride(); }
|
inline Index innerStride() const { return m_matrix.innerStride(); }
|
||||||
|
|
||||||
|
#ifdef EIGEN_TEST_EVALUATORS
|
||||||
|
|
||||||
|
/** \sa MatrixBase::operator+=() */
|
||||||
|
template<typename Other>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
TriangularView& operator+=(const DenseBase<Other>& other) {
|
||||||
|
internal::call_assignment_no_alias(*this, other.derived(), internal::add_assign_op<Scalar>());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
/** \sa MatrixBase::operator-=() */
|
||||||
|
template<typename Other>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
TriangularView& operator-=(const DenseBase<Other>& other) {
|
||||||
|
internal::call_assignment_no_alias(*this, other.derived(), internal::sub_assign_op<Scalar>());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
/** \sa MatrixBase::operator+=() */
|
/** \sa MatrixBase::operator+=() */
|
||||||
template<typename Other>
|
template<typename Other>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
@ -241,6 +259,7 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView
|
|||||||
template<typename Other>
|
template<typename Other>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
TriangularView& operator-=(const DenseBase<Other>& other) { return *this = m_matrix - other.derived(); }
|
TriangularView& operator-=(const DenseBase<Other>& other) { return *this = m_matrix - other.derived(); }
|
||||||
|
#endif
|
||||||
/** \sa MatrixBase::operator*=() */
|
/** \sa MatrixBase::operator*=() */
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
TriangularView& operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix * other; }
|
TriangularView& operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix * other; }
|
||||||
@ -527,12 +546,18 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView
|
|||||||
|
|
||||||
#endif // EIGEN_TEST_EVALUATORS
|
#endif // EIGEN_TEST_EVALUATORS
|
||||||
|
|
||||||
protected:
|
#ifdef EIGEN_TEST_EVALUATORS
|
||||||
|
template<typename ProductType>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE TriangularView& _assignProduct(const ProductType& prod, const Scalar& alpha);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
#else
|
||||||
|
protected:
|
||||||
template<typename ProductDerived, typename Lhs, typename Rhs>
|
template<typename ProductDerived, typename Lhs, typename Rhs>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE TriangularView& assignProduct(const ProductBase<ProductDerived, Lhs,Rhs>& prod, const Scalar& alpha);
|
EIGEN_STRONG_INLINE TriangularView& assignProduct(const ProductBase<ProductDerived, Lhs,Rhs>& prod, const Scalar& alpha);
|
||||||
|
#endif
|
||||||
MatrixTypeNested m_matrix;
|
MatrixTypeNested m_matrix;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -720,7 +745,7 @@ template<typename OtherDerived>
|
|||||||
inline TriangularView<MatrixType, Mode>&
|
inline TriangularView<MatrixType, Mode>&
|
||||||
TriangularView<MatrixType, Mode>::operator=(const MatrixBase<OtherDerived>& other)
|
TriangularView<MatrixType, Mode>::operator=(const MatrixBase<OtherDerived>& other)
|
||||||
{
|
{
|
||||||
internal::call_assignment(*this, other.template triangularView<Mode>(), internal::assign_op<Scalar>());
|
internal::call_assignment_no_alias(*this, other.derived(), internal::assign_op<Scalar>());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1253,6 +1278,45 @@ void TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived> &other) const
|
|||||||
other.derived().resize(this->rows(), this->cols());
|
other.derived().resize(this->rows(), this->cols());
|
||||||
internal::call_triangular_assignment_loop<Derived::Mode,(Derived::Mode&SelfAdjoint)==0 /* SetOpposite */>(other.derived(), derived().nestedExpression());
|
internal::call_triangular_assignment_loop<Derived::Mode,(Derived::Mode&SelfAdjoint)==0 /* SetOpposite */>(other.derived(), derived().nestedExpression());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// Triangular = Product
|
||||||
|
template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
|
||||||
|
struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::assign_op<Scalar>, Dense2Triangular, Scalar>
|
||||||
|
{
|
||||||
|
typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType;
|
||||||
|
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar> &)
|
||||||
|
{
|
||||||
|
dst.setZero();
|
||||||
|
dst._assignProduct(src, 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Triangular += Product
|
||||||
|
template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
|
||||||
|
struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::add_assign_op<Scalar>, Dense2Triangular, Scalar>
|
||||||
|
{
|
||||||
|
typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType;
|
||||||
|
static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<Scalar> &)
|
||||||
|
{
|
||||||
|
dst._assignProduct(src, 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Triangular -= Product
|
||||||
|
template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
|
||||||
|
struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::sub_assign_op<Scalar>, Dense2Triangular, Scalar>
|
||||||
|
{
|
||||||
|
typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType;
|
||||||
|
static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<Scalar> &)
|
||||||
|
{
|
||||||
|
dst._assignProduct(src, -1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace internal
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // EIGEN_ENABLE_EVALUATORS
|
#endif // EIGEN_ENABLE_EVALUATORS
|
||||||
|
@ -264,6 +264,16 @@ struct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,false>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef EIGEN_TEST_EVALUATORS
|
||||||
|
template<typename MatrixType, unsigned int UpLo>
|
||||||
|
template<typename ProductType>
|
||||||
|
TriangularView<MatrixType,UpLo>& TriangularView<MatrixType,UpLo>::_assignProduct(const ProductType& prod, const Scalar& alpha)
|
||||||
|
{
|
||||||
|
general_product_to_triangular_selector<MatrixType, ProductType, UpLo, internal::traits<ProductType>::InnerSize==1>::run(m_matrix.const_cast_derived(), prod, alpha);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#else
|
||||||
template<typename MatrixType, unsigned int UpLo>
|
template<typename MatrixType, unsigned int UpLo>
|
||||||
template<typename ProductDerived, typename _Lhs, typename _Rhs>
|
template<typename ProductDerived, typename _Lhs, typename _Rhs>
|
||||||
TriangularView<MatrixType,UpLo>& TriangularView<MatrixType,UpLo>::assignProduct(const ProductBase<ProductDerived, _Lhs,_Rhs>& prod, const Scalar& alpha)
|
TriangularView<MatrixType,UpLo>& TriangularView<MatrixType,UpLo>::assignProduct(const ProductBase<ProductDerived, _Lhs,_Rhs>& prod, const Scalar& alpha)
|
||||||
@ -272,7 +282,7 @@ TriangularView<MatrixType,UpLo>& TriangularView<MatrixType,UpLo>::assignProduct(
|
|||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
|
#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
|
||||||
|
@ -114,8 +114,7 @@ template<typename MatrixType> void product_notemporary(const MatrixType& m)
|
|||||||
VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().array().abs().sum(), 0 );
|
VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().array().abs().sum(), 0 );
|
||||||
|
|
||||||
// Zero temporaries for ... CoeffBasedProductMode
|
// Zero temporaries for ... CoeffBasedProductMode
|
||||||
// - does not work with GCC because of the <..>, we'ld need variadic macros ...
|
VERIFY_EVALUATION_COUNT( m3.col(0).template head<5>() * m3.col(0).transpose() + m3.col(0).template head<5>() * m3.col(0).transpose(), 0 );
|
||||||
//VERIFY_EVALUATION_COUNT( m3.col(0).head<5>() * m3.col(0).transpose() + m3.col(0).head<5>() * m3.col(0).transpose(), 0 );
|
|
||||||
|
|
||||||
// Check matrix * vectors
|
// Check matrix * vectors
|
||||||
VERIFY_EVALUATION_COUNT( cvres.noalias() = m1 * cv1, 0 );
|
VERIFY_EVALUATION_COUNT( cvres.noalias() = m1 * cv1, 0 );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user