Eigne Matrix Class Library
Dependents: Eigen_test Odometry_test AttitudeEstimation_usingTicker MPU9250_Quaternion_Binary_Serial ... more
Select.h
00001 // This file is part of Eigen, a lightweight C++ template library 00002 // for linear algebra. 00003 // 00004 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 00005 // 00006 // This Source Code Form is subject to the terms of the Mozilla 00007 // Public License v. 2.0. If a copy of the MPL was not distributed 00008 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 00009 00010 #ifndef EIGEN_SELECT_H 00011 #define EIGEN_SELECT_H 00012 00013 namespace Eigen { 00014 00015 /** \class Select 00016 * \ingroup Core_Module 00017 * 00018 * \brief Expression of a coefficient wise version of the C++ ternary operator ?: 00019 * 00020 * \param ConditionMatrixType the type of the \em condition expression which must be a boolean matrix 00021 * \param ThenMatrixType the type of the \em then expression 00022 * \param ElseMatrixType the type of the \em else expression 00023 * 00024 * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:. 00025 * It is the return type of DenseBase::select() and most of the time this is the only way it is used. 00026 * 00027 * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const 00028 */ 00029 00030 namespace internal { 00031 template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> 00032 struct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> > 00033 : traits<ThenMatrixType> 00034 { 00035 typedef typename traits<ThenMatrixType>::Scalar Scalar; 00036 typedef Dense StorageKind; 00037 typedef typename traits<ThenMatrixType>::XprKind XprKind; 00038 typedef typename ConditionMatrixType::Nested ConditionMatrixNested; 00039 typedef typename ThenMatrixType::Nested ThenMatrixNested; 00040 typedef typename ElseMatrixType::Nested ElseMatrixNested; 00041 enum { 00042 RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime, 00043 ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime, 00044 MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime, 00045 MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime, 00046 Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & HereditaryBits, 00047 CoeffReadCost = traits<typename remove_all<ConditionMatrixNested>::type>::CoeffReadCost 00048 + EIGEN_SIZE_MAX(traits<typename remove_all<ThenMatrixNested>::type>::CoeffReadCost, 00049 traits<typename remove_all<ElseMatrixNested>::type>::CoeffReadCost) 00050 }; 00051 }; 00052 } 00053 00054 template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> 00055 class Select : internal::no_assignment_operator, 00056 public internal::dense_xpr_base< Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type 00057 { 00058 public: 00059 00060 typedef typename internal::dense_xpr_base<Select>::type Base; 00061 EIGEN_DENSE_PUBLIC_INTERFACE(Select) 00062 00063 Select(const ConditionMatrixType& a_conditionMatrix, 00064 const ThenMatrixType& a_thenMatrix, 00065 const ElseMatrixType& a_elseMatrix) 00066 : m_condition(a_conditionMatrix), m_then(a_thenMatrix), m_else(a_elseMatrix) 00067 { 00068 eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows()); 00069 eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols()); 00070 } 00071 00072 Index rows() const { return m_condition.rows(); } 00073 Index cols() const { return m_condition.cols(); } 00074 00075 const Scalar coeff(Index i, Index j) const 00076 { 00077 if (m_condition.coeff(i,j)) 00078 return m_then.coeff(i,j); 00079 else 00080 return m_else.coeff(i,j); 00081 } 00082 00083 const Scalar coeff(Index i) const 00084 { 00085 if (m_condition.coeff(i)) 00086 return m_then.coeff(i); 00087 else 00088 return m_else.coeff(i); 00089 } 00090 00091 const ConditionMatrixType& conditionMatrix() const 00092 { 00093 return m_condition; 00094 } 00095 00096 const ThenMatrixType& thenMatrix() const 00097 { 00098 return m_then; 00099 } 00100 00101 const ElseMatrixType& elseMatrix() const 00102 { 00103 return m_else; 00104 } 00105 00106 protected: 00107 typename ConditionMatrixType::Nested m_condition; 00108 typename ThenMatrixType::Nested m_then; 00109 typename ElseMatrixType::Nested m_else; 00110 }; 00111 00112 00113 /** \returns a matrix where each coefficient (i,j) is equal to \a thenMatrix(i,j) 00114 * if \c *this(i,j), and \a elseMatrix(i,j) otherwise. 00115 * 00116 * Example: \include MatrixBase_select.cpp 00117 * Output: \verbinclude MatrixBase_select.out 00118 * 00119 * \sa class Select 00120 */ 00121 template<typename Derived> 00122 template<typename ThenDerived,typename ElseDerived> 00123 inline const Select<Derived,ThenDerived,ElseDerived> 00124 DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix, 00125 const DenseBase<ElseDerived>& elseMatrix) const 00126 { 00127 return Select<Derived,ThenDerived,ElseDerived>(derived(), thenMatrix.derived(), elseMatrix.derived()); 00128 } 00129 00130 /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with 00131 * the \em else expression being a scalar value. 00132 * 00133 * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select 00134 */ 00135 template<typename Derived> 00136 template<typename ThenDerived> 00137 inline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType> 00138 DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix, 00139 const typename ThenDerived::Scalar& elseScalar) const 00140 { 00141 return Select<Derived,ThenDerived,typename ThenDerived::ConstantReturnType>( 00142 derived(), thenMatrix.derived(), ThenDerived::Constant(rows(),cols(),elseScalar)); 00143 } 00144 00145 /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with 00146 * the \em then expression being a scalar value. 00147 * 00148 * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select 00149 */ 00150 template<typename Derived> 00151 template<typename ElseDerived> 00152 inline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived > 00153 DenseBase<Derived>::select(const typename ElseDerived::Scalar& thenScalar, 00154 const DenseBase<ElseDerived>& elseMatrix) const 00155 { 00156 return Select<Derived,typename ElseDerived::ConstantReturnType,ElseDerived>( 00157 derived(), ElseDerived::Constant(rows(),cols(),thenScalar), elseMatrix.derived()); 00158 } 00159 00160 } // end namespace Eigen 00161 00162 #endif // EIGEN_SELECT_H
Generated on Tue Jul 12 2022 17:46:59 by 1.7.2