Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 Thu Nov 17 2022 22:01:30 by
1.7.2