1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_REPLICATE_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_REPLICATE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int RowFactor,int ColFactor> 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<Replicate<MatrixType,RowFactor,ColFactor> > 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<MatrixType> 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<MatrixType>::StorageKind StorageKind; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<MatrixType>::XprKind XprKind; 232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename ref_selector<MatrixType>::type MatrixTypeNested; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ? Dynamic 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : RowFactor * MatrixType::RowsAtCompileTime, 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ? Dynamic 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : ColFactor * MatrixType::ColsAtCompileTime, 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //FIXME we don't propagate the max sizes !!! 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = RowsAtCompileTime, 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = ColsAtCompileTime, 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : (MatrixType::Flags & RowMajorBit) ? 1 : 0, 382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // FIXME enable DirectAccess with negative strides? 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Flags = IsRowMajor ? RowMajorBit : 0 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** 462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \class Replicate 472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \ingroup Core_Module 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \brief Expression of the multiple replication of a matrix or vector 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \tparam MatrixType the type of the object we are replicating 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \tparam RowFactor number of repetitions at compile time along the vertical direction, can be Dynamic. 532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \tparam ColFactor number of repetitions at compile time along the horizontal direction, can be Dynamic. 542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * This class represents an expression of the multiple replication of a matrix or vector. 562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * It is the return type of DenseBase::replicate() and most of the time 572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * this is the only way it is used. 582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \sa DenseBase::replicate() 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang */ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Replicate>::_MatrixTypeNested _MatrixTypeNested; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::dense_xpr_base<Replicate>::type Base; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DENSE_PUBLIC_INTERFACE(Replicate) 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename internal::remove_all<MatrixType>::type NestedExpression; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OriginalMatrixType> 732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC 742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang inline explicit Replicate(const OriginalMatrixType& matrix) 752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang : m_matrix(matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor) 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value), 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic); 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OriginalMatrixType> 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC 842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang inline Replicate(const OriginalMatrixType& matrix, Index rowFactor, Index colFactor) 852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang : m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor) 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value), 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); } 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); } 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const _MatrixTypeNested& nestedExpression() const 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_matrix; 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixTypeNested m_matrix; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const internal::variable_if_dynamic<Index, ColFactor> m_colFactor; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \return an expression of the replication of \c *this 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_replicate.cpp 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_replicate.out 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int RowFactor, int ColFactor> 118615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayconst Replicate<Derived,RowFactor,ColFactor> 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::replicate() const 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Replicate<Derived,RowFactor,ColFactor>(derived()); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \return an expression of the replication of each column (or row) of \c *this 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include DirectionWise_replicate_int.cpp 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude DirectionWise_replicate_int.out 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction> 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathVectorwiseOp<ExpressionType,Direction>::replicate(Index factor) const 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1); 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_REPLICATE_H 143