1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-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_SELECT_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SELECT_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class Select 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Expression of a coefficient wise version of the C++ ternary operator ?: 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param ConditionMatrixType the type of the \em condition expression which must be a boolean matrix 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param ThenMatrixType the type of the \em then expression 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param ElseMatrixType the type of the \em else expression 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:. 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is the return type of DenseBase::select() and most of the time this is the only way it is used. 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> > 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<ThenMatrixType> 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<ThenMatrixType>::Scalar Scalar; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Dense StorageKind; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<ThenMatrixType>::XprKind XprKind; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename ConditionMatrixType::Nested ConditionMatrixNested; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename ThenMatrixType::Nested ThenMatrixNested; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename ElseMatrixType::Nested ElseMatrixNested; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime, 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime, 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime, 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime, 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & HereditaryBits, 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = traits<typename remove_all<ConditionMatrixNested>::type>::CoeffReadCost 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + EIGEN_SIZE_MAX(traits<typename remove_all<ThenMatrixNested>::type>::CoeffReadCost, 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath traits<typename remove_all<ElseMatrixNested>::type>::CoeffReadCost) 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass Select : internal::no_assignment_operator, 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public internal::dense_xpr_base< Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::dense_xpr_base<Select>::type Base; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DENSE_PUBLIC_INTERFACE(Select) 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Select(const ConditionMatrixType& a_conditionMatrix, 647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez const ThenMatrixType& a_thenMatrix, 657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez const ElseMatrixType& a_elseMatrix) 667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez : m_condition(a_conditionMatrix), m_then(a_thenMatrix), m_else(a_elseMatrix) 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows()); 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols()); 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index rows() const { return m_condition.rows(); } 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index cols() const { return m_condition.cols(); } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar coeff(Index i, Index j) const 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (m_condition.coeff(i,j)) 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_then.coeff(i,j); 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_else.coeff(i,j); 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar coeff(Index i) const 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (m_condition.coeff(i)) 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_then.coeff(i); 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_else.coeff(i); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const ConditionMatrixType& conditionMatrix() const 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_condition; 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const ThenMatrixType& thenMatrix() const 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_then; 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const ElseMatrixType& elseMatrix() const 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_else; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename ConditionMatrixType::Nested m_condition; 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename ThenMatrixType::Nested m_then; 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename ElseMatrixType::Nested m_else; 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a matrix where each coefficient (i,j) is equal to \a thenMatrix(i,j) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * if \c *this(i,j), and \a elseMatrix(i,j) otherwise. 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_select.cpp 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_select.out 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Select 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ThenDerived,typename ElseDerived> 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Select<Derived,ThenDerived,ElseDerived> 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix, 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DenseBase<ElseDerived>& elseMatrix) const 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Select<Derived,ThenDerived,ElseDerived>(derived(), thenMatrix.derived(), elseMatrix.derived()); 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Version of DenseBase::select(const DenseBase&, const DenseBase&) with 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the \em else expression being a scalar value. 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ThenDerived> 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType> 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix, 1397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez const typename ThenDerived::Scalar& elseScalar) const 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Select<Derived,ThenDerived,typename ThenDerived::ConstantReturnType>( 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived(), thenMatrix.derived(), ThenDerived::Constant(rows(),cols(),elseScalar)); 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Version of DenseBase::select(const DenseBase&, const DenseBase&) with 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the \em then expression being a scalar value. 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ElseDerived> 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived > 1537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezDenseBase<Derived>::select(const typename ElseDerived::Scalar& thenScalar, 1547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez const DenseBase<ElseDerived>& elseMatrix) const 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Select<Derived,typename ElseDerived::ConstantReturnType,ElseDerived>( 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived(), ElseDerived::Constant(rows(),cols(),thenScalar), elseMatrix.derived()); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SELECT_H 163