Eigne Matrix Class Library

Dependents:   MPC_current_control HydraulicControlBoard_SW AHRS Test_ekf ... more

Committer:
jsoh91
Date:
Tue Sep 24 00:18:23 2019 +0000
Revision:
1:3b8049da21b8
Parent:
0:13a5d365ba16
ignore and revise some of error parts

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:13a5d365ba16 1 // This file is part of Eigen, a lightweight C++ template library
ykuroda 0:13a5d365ba16 2 // for linear algebra.
ykuroda 0:13a5d365ba16 3 //
ykuroda 0:13a5d365ba16 4 // Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
ykuroda 0:13a5d365ba16 5 //
ykuroda 0:13a5d365ba16 6 // This Source Code Form is subject to the terms of the Mozilla
ykuroda 0:13a5d365ba16 7 // Public License v. 2.0. If a copy of the MPL was not distributed
ykuroda 0:13a5d365ba16 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
ykuroda 0:13a5d365ba16 9
ykuroda 0:13a5d365ba16 10 #ifndef EIGEN_REPLICATE_H
ykuroda 0:13a5d365ba16 11 #define EIGEN_REPLICATE_H
ykuroda 0:13a5d365ba16 12
ykuroda 0:13a5d365ba16 13 namespace Eigen {
ykuroda 0:13a5d365ba16 14
ykuroda 0:13a5d365ba16 15 /**
ykuroda 0:13a5d365ba16 16 * \class Replicate
ykuroda 0:13a5d365ba16 17 * \ingroup Core_Module
ykuroda 0:13a5d365ba16 18 *
ykuroda 0:13a5d365ba16 19 * \brief Expression of the multiple replication of a matrix or vector
ykuroda 0:13a5d365ba16 20 *
ykuroda 0:13a5d365ba16 21 * \param MatrixType the type of the object we are replicating
ykuroda 0:13a5d365ba16 22 *
ykuroda 0:13a5d365ba16 23 * This class represents an expression of the multiple replication of a matrix or vector.
ykuroda 0:13a5d365ba16 24 * It is the return type of DenseBase::replicate() and most of the time
ykuroda 0:13a5d365ba16 25 * this is the only way it is used.
ykuroda 0:13a5d365ba16 26 *
ykuroda 0:13a5d365ba16 27 * \sa DenseBase::replicate()
ykuroda 0:13a5d365ba16 28 */
ykuroda 0:13a5d365ba16 29
ykuroda 0:13a5d365ba16 30 namespace internal {
ykuroda 0:13a5d365ba16 31 template<typename MatrixType,int RowFactor,int ColFactor>
ykuroda 0:13a5d365ba16 32 struct traits<Replicate<MatrixType,RowFactor,ColFactor> >
ykuroda 0:13a5d365ba16 33 : traits<MatrixType>
ykuroda 0:13a5d365ba16 34 {
ykuroda 0:13a5d365ba16 35 typedef typename MatrixType::Scalar Scalar;
ykuroda 0:13a5d365ba16 36 typedef typename traits<MatrixType>::StorageKind StorageKind;
ykuroda 0:13a5d365ba16 37 typedef typename traits<MatrixType>::XprKind XprKind;
ykuroda 0:13a5d365ba16 38 enum {
ykuroda 0:13a5d365ba16 39 Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor
ykuroda 0:13a5d365ba16 40 };
ykuroda 0:13a5d365ba16 41 typedef typename nested<MatrixType,Factor>::type MatrixTypeNested;
ykuroda 0:13a5d365ba16 42 typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
ykuroda 0:13a5d365ba16 43 enum {
ykuroda 0:13a5d365ba16 44 RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic
ykuroda 0:13a5d365ba16 45 ? Dynamic
ykuroda 0:13a5d365ba16 46 : RowFactor * MatrixType::RowsAtCompileTime,
ykuroda 0:13a5d365ba16 47 ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic
ykuroda 0:13a5d365ba16 48 ? Dynamic
ykuroda 0:13a5d365ba16 49 : ColFactor * MatrixType::ColsAtCompileTime,
ykuroda 0:13a5d365ba16 50 //FIXME we don't propagate the max sizes !!!
ykuroda 0:13a5d365ba16 51 MaxRowsAtCompileTime = RowsAtCompileTime,
ykuroda 0:13a5d365ba16 52 MaxColsAtCompileTime = ColsAtCompileTime,
ykuroda 0:13a5d365ba16 53 IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1
ykuroda 0:13a5d365ba16 54 : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0
ykuroda 0:13a5d365ba16 55 : (MatrixType::Flags & RowMajorBit) ? 1 : 0,
ykuroda 0:13a5d365ba16 56 Flags = (_MatrixTypeNested::Flags & HereditaryBits & ~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0),
ykuroda 0:13a5d365ba16 57 CoeffReadCost = _MatrixTypeNested::CoeffReadCost
ykuroda 0:13a5d365ba16 58 };
ykuroda 0:13a5d365ba16 59 };
ykuroda 0:13a5d365ba16 60 }
ykuroda 0:13a5d365ba16 61
ykuroda 0:13a5d365ba16 62 template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
ykuroda 0:13a5d365ba16 63 : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type
ykuroda 0:13a5d365ba16 64 {
ykuroda 0:13a5d365ba16 65 typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;
ykuroda 0:13a5d365ba16 66 typedef typename internal::traits<Replicate>::_MatrixTypeNested _MatrixTypeNested;
ykuroda 0:13a5d365ba16 67 public:
ykuroda 0:13a5d365ba16 68
ykuroda 0:13a5d365ba16 69 typedef typename internal::dense_xpr_base<Replicate>::type Base;
ykuroda 0:13a5d365ba16 70 EIGEN_DENSE_PUBLIC_INTERFACE(Replicate)
ykuroda 0:13a5d365ba16 71
ykuroda 0:13a5d365ba16 72 template<typename OriginalMatrixType>
ykuroda 0:13a5d365ba16 73 inline explicit Replicate(const OriginalMatrixType& a_matrix)
ykuroda 0:13a5d365ba16 74 : m_matrix(a_matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor)
ykuroda 0:13a5d365ba16 75 {
ykuroda 0:13a5d365ba16 76 EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),
ykuroda 0:13a5d365ba16 77 THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
ykuroda 0:13a5d365ba16 78 eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic);
ykuroda 0:13a5d365ba16 79 }
ykuroda 0:13a5d365ba16 80
ykuroda 0:13a5d365ba16 81 template<typename OriginalMatrixType>
ykuroda 0:13a5d365ba16 82 inline Replicate(const OriginalMatrixType& a_matrix, Index rowFactor, Index colFactor)
ykuroda 0:13a5d365ba16 83 : m_matrix(a_matrix), m_rowFactor(rowFactor), m_colFactor(colFactor)
ykuroda 0:13a5d365ba16 84 {
ykuroda 0:13a5d365ba16 85 EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),
ykuroda 0:13a5d365ba16 86 THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
ykuroda 0:13a5d365ba16 87 }
ykuroda 0:13a5d365ba16 88
ykuroda 0:13a5d365ba16 89 inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }
ykuroda 0:13a5d365ba16 90 inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
ykuroda 0:13a5d365ba16 91
ykuroda 0:13a5d365ba16 92 inline Scalar coeff(Index rowId, Index colId) const
ykuroda 0:13a5d365ba16 93 {
ykuroda 0:13a5d365ba16 94 // try to avoid using modulo; this is a pure optimization strategy
ykuroda 0:13a5d365ba16 95 const Index actual_row = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0
ykuroda 0:13a5d365ba16 96 : RowFactor==1 ? rowId
ykuroda 0:13a5d365ba16 97 : rowId%m_matrix.rows();
ykuroda 0:13a5d365ba16 98 const Index actual_col = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0
ykuroda 0:13a5d365ba16 99 : ColFactor==1 ? colId
ykuroda 0:13a5d365ba16 100 : colId%m_matrix.cols();
ykuroda 0:13a5d365ba16 101
ykuroda 0:13a5d365ba16 102 return m_matrix.coeff(actual_row, actual_col);
ykuroda 0:13a5d365ba16 103 }
ykuroda 0:13a5d365ba16 104 template<int LoadMode>
ykuroda 0:13a5d365ba16 105 inline PacketScalar packet(Index rowId, Index colId) const
ykuroda 0:13a5d365ba16 106 {
ykuroda 0:13a5d365ba16 107 const Index actual_row = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0
ykuroda 0:13a5d365ba16 108 : RowFactor==1 ? rowId
ykuroda 0:13a5d365ba16 109 : rowId%m_matrix.rows();
ykuroda 0:13a5d365ba16 110 const Index actual_col = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0
ykuroda 0:13a5d365ba16 111 : ColFactor==1 ? colId
ykuroda 0:13a5d365ba16 112 : colId%m_matrix.cols();
ykuroda 0:13a5d365ba16 113
ykuroda 0:13a5d365ba16 114 return m_matrix.template packet<LoadMode>(actual_row, actual_col);
ykuroda 0:13a5d365ba16 115 }
ykuroda 0:13a5d365ba16 116
ykuroda 0:13a5d365ba16 117 const _MatrixTypeNested& nestedExpression() const
ykuroda 0:13a5d365ba16 118 {
ykuroda 0:13a5d365ba16 119 return m_matrix;
ykuroda 0:13a5d365ba16 120 }
ykuroda 0:13a5d365ba16 121
ykuroda 0:13a5d365ba16 122 protected:
ykuroda 0:13a5d365ba16 123 MatrixTypeNested m_matrix;
ykuroda 0:13a5d365ba16 124 const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;
ykuroda 0:13a5d365ba16 125 const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;
ykuroda 0:13a5d365ba16 126 };
ykuroda 0:13a5d365ba16 127
ykuroda 0:13a5d365ba16 128 /**
ykuroda 0:13a5d365ba16 129 * \return an expression of the replication of \c *this
ykuroda 0:13a5d365ba16 130 *
ykuroda 0:13a5d365ba16 131 * Example: \include MatrixBase_replicate.cpp
ykuroda 0:13a5d365ba16 132 * Output: \verbinclude MatrixBase_replicate.out
ykuroda 0:13a5d365ba16 133 *
ykuroda 0:13a5d365ba16 134 * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate
ykuroda 0:13a5d365ba16 135 */
ykuroda 0:13a5d365ba16 136 template<typename Derived>
ykuroda 0:13a5d365ba16 137 template<int RowFactor, int ColFactor>
ykuroda 0:13a5d365ba16 138 const Replicate<Derived,RowFactor,ColFactor>
ykuroda 0:13a5d365ba16 139 DenseBase<Derived>::replicate() const
ykuroda 0:13a5d365ba16 140 {
ykuroda 0:13a5d365ba16 141 return Replicate<Derived,RowFactor,ColFactor>(derived());
ykuroda 0:13a5d365ba16 142 }
ykuroda 0:13a5d365ba16 143
ykuroda 0:13a5d365ba16 144 /**
ykuroda 0:13a5d365ba16 145 * \return an expression of the replication of \c *this
ykuroda 0:13a5d365ba16 146 *
ykuroda 0:13a5d365ba16 147 * Example: \include MatrixBase_replicate_int_int.cpp
ykuroda 0:13a5d365ba16 148 * Output: \verbinclude MatrixBase_replicate_int_int.out
ykuroda 0:13a5d365ba16 149 *
ykuroda 0:13a5d365ba16 150 * \sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate
ykuroda 0:13a5d365ba16 151 */
ykuroda 0:13a5d365ba16 152 template<typename Derived>
ykuroda 0:13a5d365ba16 153 const typename DenseBase<Derived>::ReplicateReturnType
ykuroda 0:13a5d365ba16 154 DenseBase<Derived>::replicate(Index rowFactor,Index colFactor) const
ykuroda 0:13a5d365ba16 155 {
ykuroda 0:13a5d365ba16 156 return Replicate<Derived,Dynamic,Dynamic>(derived(),rowFactor,colFactor);
ykuroda 0:13a5d365ba16 157 }
ykuroda 0:13a5d365ba16 158
ykuroda 0:13a5d365ba16 159 /**
ykuroda 0:13a5d365ba16 160 * \return an expression of the replication of each column (or row) of \c *this
ykuroda 0:13a5d365ba16 161 *
ykuroda 0:13a5d365ba16 162 * Example: \include DirectionWise_replicate_int.cpp
ykuroda 0:13a5d365ba16 163 * Output: \verbinclude DirectionWise_replicate_int.out
ykuroda 0:13a5d365ba16 164 *
ykuroda 0:13a5d365ba16 165 * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate
ykuroda 0:13a5d365ba16 166 */
ykuroda 0:13a5d365ba16 167 template<typename ExpressionType, int Direction>
ykuroda 0:13a5d365ba16 168 const typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
ykuroda 0:13a5d365ba16 169 VectorwiseOp<ExpressionType,Direction>::replicate(Index factor) const
ykuroda 0:13a5d365ba16 170 {
ykuroda 0:13a5d365ba16 171 return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
ykuroda 0:13a5d365ba16 172 (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
ykuroda 0:13a5d365ba16 173 }
ykuroda 0:13a5d365ba16 174
ykuroda 0:13a5d365ba16 175 } // end namespace Eigen
ykuroda 0:13a5d365ba16 176
ykuroda 0:13a5d365ba16 177 #endif // EIGEN_REPLICATE_H