10 #ifndef EIGEN_HOMOGENEOUS_H    11 #define EIGEN_HOMOGENEOUS_H    32 template<
typename MatrixType,
int Direction>
    40     RowsPlusOne = (MatrixType::RowsAtCompileTime != 
Dynamic) ?
    41                   int(MatrixType::RowsAtCompileTime) + 1 : 
Dynamic,
    42     ColsPlusOne = (MatrixType::ColsAtCompileTime != 
Dynamic) ?
    43                   int(MatrixType::ColsAtCompileTime) + 1 : 
Dynamic,
    44     RowsAtCompileTime = Direction==
Vertical  ?  RowsPlusOne : MatrixType::RowsAtCompileTime,
    45     ColsAtCompileTime = Direction==
Horizontal ? ColsPlusOne : MatrixType::ColsAtCompileTime,
    46     MaxRowsAtCompileTime = RowsAtCompileTime,
    47     MaxColsAtCompileTime = ColsAtCompileTime,
    60 template<
typename MatrixType,
int _Direction> 
class Homogeneous    66     enum { Direction = _Direction };
    71     EIGEN_DEVICE_FUNC explicit inline 
Homogeneous(const MatrixType& matrix)
    75     EIGEN_DEVICE_FUNC 
inline Index rows()
 const { 
return m_matrix.rows() + (int(Direction)==
Vertical   ? 1 : 0); }
    76     EIGEN_DEVICE_FUNC 
inline Index cols()
 const { 
return m_matrix.cols() + (int(Direction)==
Horizontal ? 1 : 0); }
    78     EIGEN_DEVICE_FUNC 
const NestedExpression& 
nestedExpression()
 const { 
return m_matrix; }
    80     template<
typename Rhs>
    88     template<
typename Lhs> 
friend    96     template<
typename Scalar, 
int Dim, 
int Mode, 
int Options> 
friend   101       return Product<Transform<Scalar,Dim,Mode,Options>, 
Homogeneous>(lhs,rhs);
   104     template<
typename Func>
   108       return func(m_matrix.redux(func), Scalar(1));
   128 template<
typename Derived>
   146 template<
typename ExpressionType, 
int Direction>
   170 template<
typename Derived>
   176     ColsAtCompileTime==1?size()-1:1,
   177     ColsAtCompileTime==1?1:size()-1) / coeff(size()-1);
   194 template<
typename ExpressionType, 
int Direction>
   199       Direction==
Vertical   ? _expression().rows()-1 : _expression().rows(),
   200       Direction==
Horizontal ? _expression().cols()-1 : _expression().cols()).cwiseQuotient(
   202                 Direction==
Vertical   ? HNormalized_SizeMinusOne : 1,
   203                 Direction==
Horizontal ? HNormalized_SizeMinusOne : 1>
   205           Direction==
Vertical    ? _expression().rows()-1:0,
   206           Direction==
Horizontal  ? _expression().cols()-1:0,
   207           Direction==
Vertical    ? 1 : _expression().rows(),
   208           Direction==
Horizontal  ? 1 : _expression().cols()),
   209          Direction==
Vertical   ? _expression().rows()-1 : 1,
   210          Direction==
Horizontal ? _expression().cols()-1 : 1));
   215 template<
typename MatrixOrTransformType>
   218   typedef MatrixOrTransformType 
type;
   219   EIGEN_DEVICE_FUNC 
static const type& 
run(
const type &x) { 
return x; }
   222 template<
typename Scalar, 
int Dim, 
int Mode,
int Options>
   227   EIGEN_DEVICE_FUNC 
static type 
run (
const TransformType& x) { 
return x.
affine(); }
   230 template<
typename Scalar, 
int Dim, 
int Options>
   235   EIGEN_DEVICE_FUNC 
static const type& 
run (
const TransformType& x) { 
return x.
matrix(); }
   238 template<
typename MatrixType,
typename Lhs>
   246                  LhsMatrixTypeCleaned::RowsAtCompileTime,
   247                  MatrixTypeCleaned::ColsAtCompileTime,
   248                  MatrixTypeCleaned::PlainObject::Options,
   249                  LhsMatrixTypeCleaned::MaxRowsAtCompileTime,
   253 template<
typename MatrixType,
typename Lhs>
   255   : 
public ReturnByValue<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >
   265   EIGEN_DEVICE_FUNC 
inline Index rows()
 const { 
return m_lhs.rows(); }
   266   EIGEN_DEVICE_FUNC 
inline Index cols()
 const { 
return m_rhs.cols(); }
   268   template<
typename Dest> EIGEN_DEVICE_FUNC 
void evalTo(Dest& dst)
 const   271     dst = 
Block<
const LhsMatrixTypeNested,
   272               LhsMatrixTypeNested::RowsAtCompileTime,
   273               LhsMatrixTypeNested::ColsAtCompileTime==
Dynamic?
Dynamic:LhsMatrixTypeNested::ColsAtCompileTime-1>
   274             (m_lhs,0,0,m_lhs.rows(),m_lhs.cols()-1) * m_rhs;
   275     dst += m_lhs.col(m_lhs.cols()-1).rowwise()
   276             .template replicate<MatrixType::ColsAtCompileTime>(m_rhs.cols());
   279   typename LhsMatrixTypeCleaned::Nested 
m_lhs;
   283 template<
typename MatrixType,
typename Rhs>
   287                  MatrixType::RowsAtCompileTime,
   288                  Rhs::ColsAtCompileTime,
   289                  MatrixType::PlainObject::Options,
   290                  MatrixType::MaxRowsAtCompileTime,
   294 template<
typename MatrixType,
typename Rhs>
   296   : 
public ReturnByValue<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >
   300     : m_lhs(lhs), m_rhs(rhs)
   303   EIGEN_DEVICE_FUNC 
inline Index rows()
 const { 
return m_lhs.rows(); }
   304   EIGEN_DEVICE_FUNC 
inline Index cols()
 const { 
return m_rhs.cols(); }
   306   template<
typename Dest> EIGEN_DEVICE_FUNC 
void evalTo(Dest& dst)
 const   309     dst = m_lhs * 
Block<
const RhsNested,
   310                         RhsNested::RowsAtCompileTime==
Dynamic?
Dynamic:RhsNested::RowsAtCompileTime-1,
   311                         RhsNested::ColsAtCompileTime>
   312             (m_rhs,0,0,m_rhs.rows()-1,m_rhs.cols());
   313     dst += m_rhs.row(m_rhs.rows()-1).colwise()
   314             .template replicate<MatrixType::RowsAtCompileTime>(m_lhs.rows());
   321 template<
typename ArgType,
int Direction>
   331 template<
typename ArgType,
int Direction>
   333   : 
evaluator<typename Homogeneous<ArgType,Direction>::PlainObject >
   342     ::new (static_cast<Base*>(
this)) Base(m_temp);
   350 template< 
typename DstXprType, 
typename ArgType, 
typename Scalar>
   358     if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
   359       dst.resize(dstRows, dstCols);
   362     dst.row(dst.rows()-1).setOnes();
   367 template< 
typename DstXprType, 
typename ArgType, 
typename Scalar>
   375     if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
   376       dst.resize(dstRows, dstCols);
   379     dst.col(dst.cols()-1).setOnes();
   383 template<
typename LhsArg, 
typename Rhs, 
int ProductTag>
   386   template<
typename Dest>
   393 template<
typename Lhs,
typename Rhs>
   397     Dim  = Lhs::ColsAtCompileTime,
   398     Rows = Lhs::RowsAtCompileTime
   408 template<
typename Lhs, 
typename Rhs, 
int ProductTag>
   410  : 
public evaluator<typename homogeneous_right_product_refactoring_helper<typename Lhs::NestedExpression,Rhs>::Xpr>
   419     : Base(  xpr.lhs().nestedExpression() .lazyProduct(  xpr.rhs().
template topRows<helper::Dim>(xpr.lhs().nestedExpression().cols()) )
   420             + ConstantBlock(xpr.rhs().
row(xpr.rhs().rows()-1),xpr.lhs().rows(), 1) )
   424 template<
typename Lhs, 
typename RhsArg, 
int ProductTag>
   427   template<
typename Dest>
   436 template<
typename Lhs, 
typename RhsArg, 
int ProductTag>
   439   template<
typename Dest>
   442     dst.noalias() = lhs * rhs.
eval();
   446 template<
typename Lhs,
typename Rhs>
   450     Dim = Rhs::RowsAtCompileTime,
   451     Cols = Rhs::ColsAtCompileTime
   461 template<
typename Lhs, 
typename Rhs, 
int ProductTag>
   463  : 
public evaluator<typename homogeneous_left_product_refactoring_helper<Lhs,typename Rhs::NestedExpression>::Xpr>
   472     : Base(   xpr.lhs().
template leftCols<helper::Dim>(xpr.rhs().nestedExpression().rows()) .lazyProduct( xpr.rhs().nestedExpression() )
   473             + ConstantBlock(xpr.lhs().
col(xpr.lhs().cols()-1),1,xpr.rhs().cols()) )
   477 template<
typename Scalar, 
int Dim, 
int Mode,
int Options, 
typename RhsArg, 
int ProductTag>
   481   template<
typename Dest>
   488 template<
typename ExpressionType, 
int S
ide, 
bool Transposed>
   497 #endif // EIGEN_HOMOGENEOUS_H 
ref_selector< MatrixType >::type MatrixTypeNested
#define EIGEN_STRONG_INLINE
MatrixOrTransformType type
helper::ConstantBlock ConstantBlock
static EIGEN_DEVICE_FUNC void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op< Scalar, typename ArgType::Scalar > &)
Expression of the product of two arbitrary matrices or vectors. 
remove_all< LhsMatrixType >::type LhsMatrixTypeCleaned
take_matrix_for_product< Lhs >::type LhsMatrixType
evaluator< RefactoredXpr > Base
const Block< const Derived, internal::traits< Derived >::RowsAtCompileTime, 1, !IsRowMajor > ConstColXpr
EIGEN_DEVICE_FUNC const HNormalizedReturnType hnormalized() const
column or row-wise homogeneous normalization 
remove_all< typename Rhs::Nested >::type RhsNested
EIGEN_DEVICE_FUNC HomogeneousReturnType homogeneous() const
EIGEN_DEVICE_FUNC ColXpr col(Index i)
This is the const version of col(). */. 
helper::Xpr RefactoredXpr
EIGEN_DEVICE_FUNC Index cols() const
remove_reference< MatrixTypeNested >::type _MatrixTypeNested
homogeneous_right_product_refactoring_helper< typename Lhs::NestedExpression, Rhs > helper
const Block< const Derived, internal::traits< Derived >::RowsAtCompileTime, N, !IsRowMajor > Type
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::result_of< Func(Scalar, Scalar)>::type redux(const Func &func) const
Rhs::template ConstNRowsBlockXpr< Dim >::Type LinearBlockConst
EIGEN_DEVICE_FUNC HomogeneousReturnType homogeneous() const
remove_all< MatrixType >::type MatrixTypeCleaned
homogeneous_left_product_refactoring_helper< Lhs, typename Rhs::NestedExpression > helper
Homogeneous< ArgType, Vertical > SrcXprType
static void evalTo(Dest &dst, const Lhs &lhs, const Homogeneous< RhsArg, Vertical > &rhs)
CwiseBinaryOp< internal::scalar_sum_op< typename Lhs::Scalar, typename Rhs::Scalar >, const LinearProduct, const ConstantBlock > Xpr
static EIGEN_DEVICE_FUNC void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op< Scalar, typename ArgType::Scalar > &)
const unsigned int RowMajorBit
Lhs::template ConstNColsBlockXpr< Dim >::Type LinearBlockConst
Lhs::ConstColXpr ConstantColumn
Rhs::ConstRowXpr ConstantColumn
EIGEN_DEVICE_FUNC const HNormalizedReturnType hnormalized() const
homogeneous normalization 
EIGEN_DEVICE_FUNC product_evaluator(const XprType &xpr)
LhsMatrixTypeCleaned::Nested m_lhs
EIGEN_DEVICE_FUNC Index rows() const
Generic expression where a coefficient-wise binary operator is applied to two expressions. 
const unsigned int HereditaryBits
EIGEN_DEVICE_FUNC void evalTo(Dest &dst) const
helper::Xpr RefactoredXpr
EIGEN_DEVICE_FUNC RowsBlockXpr topRows(Index n)
This is the const version of topRows(Index). 
EIGEN_DEVICE_FUNC void evalTo(Dest &dst) const
EIGEN_DEVICE_FUNC homogeneous_left_product_impl(const Lhs &lhs, const MatrixType &rhs)
make_proper_matrix_type< typename traits< MatrixType >::Scalar, MatrixType::RowsAtCompileTime, Rhs::ColsAtCompileTime, MatrixType::PlainObject::Options, MatrixType::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime >::type ReturnType
EIGEN_DEVICE_FUNC homogeneous_right_product_impl(const MatrixType &lhs, const Rhs &rhs)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API. 
evaluator< PlainObject > Base
remove_all< typename LhsMatrixTypeCleaned::Nested >::type LhsMatrixTypeNested
Expression of the multiple replication of a matrix or vector. 
helper::ConstantBlock ConstantBlock
remove_all< LhsMatrixType >::type LhsMatrixTypeCleaned
const Block< const Derived, 1, internal::traits< Derived >::ColsAtCompileTime, IsRowMajor > ConstRowXpr
Product< Lhs, Rhs, LazyProduct > XprType
static EIGEN_DEVICE_FUNC const type & run(const type &x)
EIGEN_DEVICE_FUNC const Product< MatrixDerived, PermutationDerived, AliasFreeProduct > operator*(const MatrixBase< MatrixDerived > &matrix, const PermutationBase< PermutationDerived > &permutation)
traits< homogeneous_left_product_impl >::LhsMatrixType LhsMatrixType
Product< LinearBlock, Rhs, LazyProduct > LinearProduct
static EIGEN_DEVICE_FUNC void evalTo(Dest &dst, const Homogeneous< LhsArg, Horizontal > &lhs, const Rhs &rhs)
CwiseBinaryOp< internal::scalar_sum_op< typename Lhs::Scalar, typename Rhs::Scalar >, const LinearProduct, const ConstantBlock > Xpr
Product< Lhs, LinearBlock, LazyProduct > LinearProduct
EIGEN_DEVICE_FUNC const NestedExpression & nestedExpression() const
make_proper_matrix_type< typename traits< MatrixTypeCleaned >::Scalar, LhsMatrixTypeCleaned::RowsAtCompileTime, MatrixTypeCleaned::ColsAtCompileTime, MatrixTypeCleaned::PlainObject::Options, LhsMatrixTypeCleaned::MaxRowsAtCompileTime, MatrixTypeCleaned::MaxColsAtCompileTime >::type ReturnType
remove_const< LinearBlockConst >::type LinearBlock
Replicate< const ConstantColumn, 1, Cols > ConstantBlock
Expression of a fixed-size or dynamic-size block. 
storage_kind_to_evaluator_kind< typename ArgType::StorageKind >::Kind Kind
evaluator< RefactoredXpr > Base
EIGEN_DEVICE_FUNC RowXpr row(Index i)
This is the const version of row(). */. 
#define EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvalReturnType eval() const
Homogeneous< ArgType, Direction > XprType
EIGEN_DEVICE_FUNC product_evaluator(const XprType &xpr)
Expression of a diagonal/subdiagonal/superdiagonal in a matrix. 
static EIGEN_DEVICE_FUNC void evalTo(Dest &dst, const Lhs &lhs, const Homogeneous< RhsArg, Vertical > &rhs)
EIGEN_DEVICE_FUNC Index cols() const
Homogeneous< ArgType, Horizontal > SrcXprType
EIGEN_DEVICE_FUNC Index rows() const
Product< Lhs, Rhs, LazyProduct > XprType
XprType::PlainObject PlainObject
EIGEN_DEVICE_FUNC Index rows() const
The matrix class, also used for vectors and row-vectors. 
MatrixBase< Homogeneous > Base
traits< MatrixType >::StorageKind StorageKind
MatrixType::Nested m_matrix
EIGEN_DEVICE_FUNC unary_evaluator(const XprType &op)
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE)
const Block< const Derived, N, internal::traits< Derived >::ColsAtCompileTime, IsRowMajor > Type
Replicate< const ConstantColumn, Rows, 1 > ConstantBlock
Base class for all dense matrices, vectors, and expressions. 
remove_const< LinearBlockConst >::type LinearBlock
EIGEN_DEVICE_FUNC ColsBlockXpr leftCols(Index n)
This is the const version of leftCols(Index). 
MatrixType NestedExpression
EIGEN_DEVICE_FUNC Index cols() const
Expression of one (or a set of) homogeneous vector(s)