mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-06 14:14:46 +08:00
bug #1201: optimize affine*vector products
This commit is contained in:
parent
73693b5de6
commit
b6ed8244b4
@ -32,7 +32,8 @@ template< typename TransformType,
|
|||||||
typename MatrixType,
|
typename MatrixType,
|
||||||
int Case = transform_traits<TransformType>::IsProjective ? 0
|
int Case = transform_traits<TransformType>::IsProjective ? 0
|
||||||
: int(MatrixType::RowsAtCompileTime) == int(transform_traits<TransformType>::HDim) ? 1
|
: int(MatrixType::RowsAtCompileTime) == int(transform_traits<TransformType>::HDim) ? 1
|
||||||
: 2>
|
: 2,
|
||||||
|
int RhsCols = MatrixType::ColsAtCompileTime>
|
||||||
struct transform_right_product_impl;
|
struct transform_right_product_impl;
|
||||||
|
|
||||||
template< typename Other,
|
template< typename Other,
|
||||||
@ -436,7 +437,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
// note: this function is defined here because some compilers cannot find the respective declaration
|
// note: this function is defined here because some compilers cannot find the respective declaration
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_STRONG_INLINE const typename OtherDerived::PlainObject
|
EIGEN_STRONG_INLINE const typename internal::transform_right_product_impl<Transform, OtherDerived>::ResultType
|
||||||
operator * (const EigenBase<OtherDerived> &other) const
|
operator * (const EigenBase<OtherDerived> &other) const
|
||||||
{ return internal::transform_right_product_impl<Transform, OtherDerived>::run(*this,other.derived()); }
|
{ return internal::transform_right_product_impl<Transform, OtherDerived>::run(*this,other.derived()); }
|
||||||
|
|
||||||
@ -1287,8 +1288,8 @@ struct transform_product_result
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename TransformType, typename MatrixType >
|
template< typename TransformType, typename MatrixType, int RhsCols>
|
||||||
struct transform_right_product_impl< TransformType, MatrixType, 0 >
|
struct transform_right_product_impl< TransformType, MatrixType, 0, RhsCols>
|
||||||
{
|
{
|
||||||
typedef typename MatrixType::PlainObject ResultType;
|
typedef typename MatrixType::PlainObject ResultType;
|
||||||
|
|
||||||
@ -1298,8 +1299,8 @@ struct transform_right_product_impl< TransformType, MatrixType, 0 >
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename TransformType, typename MatrixType >
|
template< typename TransformType, typename MatrixType, int RhsCols>
|
||||||
struct transform_right_product_impl< TransformType, MatrixType, 1 >
|
struct transform_right_product_impl< TransformType, MatrixType, 1, RhsCols>
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
Dim = TransformType::Dim,
|
Dim = TransformType::Dim,
|
||||||
@ -1324,8 +1325,8 @@ struct transform_right_product_impl< TransformType, MatrixType, 1 >
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename TransformType, typename MatrixType >
|
template< typename TransformType, typename MatrixType, int RhsCols>
|
||||||
struct transform_right_product_impl< TransformType, MatrixType, 2 >
|
struct transform_right_product_impl< TransformType, MatrixType, 2, RhsCols>
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
Dim = TransformType::Dim,
|
Dim = TransformType::Dim,
|
||||||
@ -1348,6 +1349,30 @@ struct transform_right_product_impl< TransformType, MatrixType, 2 >
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template< typename TransformType, typename MatrixType >
|
||||||
|
struct transform_right_product_impl< TransformType, MatrixType, 2, 1> // rhs is a vector of size Dim
|
||||||
|
{
|
||||||
|
typedef typename TransformType::MatrixType TransformMatrix;
|
||||||
|
enum {
|
||||||
|
Dim = TransformType::Dim,
|
||||||
|
HDim = TransformType::HDim,
|
||||||
|
OtherRows = MatrixType::RowsAtCompileTime,
|
||||||
|
WorkingRows = EIGEN_PLAIN_ENUM_MIN(TransformMatrix::RowsAtCompileTime,HDim)
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef typename MatrixType::PlainObject ResultType;
|
||||||
|
|
||||||
|
static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
|
||||||
|
|
||||||
|
Matrix<typename ResultType::Scalar, Dim+1, 1> rhs;
|
||||||
|
rhs << other,1;
|
||||||
|
Matrix<typename ResultType::Scalar, WorkingRows, 1> res(T.matrix() * rhs);
|
||||||
|
return res.template head<Dim>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**********************************************************
|
/**********************************************************
|
||||||
*** Specializations of operator* with lhs EigenBase ***
|
*** Specializations of operator* with lhs EigenBase ***
|
||||||
**********************************************************/
|
**********************************************************/
|
||||||
|
Loading…
Reference in New Issue
Block a user