mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-08 22:21:49 +08:00
Implement evaluator for Select.
This commit is contained in:
parent
88b3116b99
commit
12a30a982f
@ -576,6 +576,45 @@ struct evaluator_impl<Block<XprType, BlockRows, BlockCols, InnerPanel, /* HasDir
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------- Select --------------------
|
||||||
|
|
||||||
|
template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
|
||||||
|
struct evaluator_impl<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
|
||||||
|
{
|
||||||
|
typedef Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> SelectType;
|
||||||
|
|
||||||
|
evaluator_impl(const SelectType& select)
|
||||||
|
: m_conditionImpl(select.conditionMatrix()),
|
||||||
|
m_thenImpl(select.thenMatrix()),
|
||||||
|
m_elseImpl(select.elseMatrix())
|
||||||
|
{ }
|
||||||
|
|
||||||
|
typedef typename SelectType::Index Index;
|
||||||
|
typedef typename SelectType::CoeffReturnType CoeffReturnType;
|
||||||
|
|
||||||
|
CoeffReturnType coeff(Index row, Index col) const
|
||||||
|
{
|
||||||
|
if (m_conditionImpl.coeff(row, col))
|
||||||
|
return m_thenImpl.coeff(row, col);
|
||||||
|
else
|
||||||
|
return m_elseImpl.coeff(row, col);
|
||||||
|
}
|
||||||
|
|
||||||
|
CoeffReturnType coeff(Index index) const
|
||||||
|
{
|
||||||
|
if (m_conditionImpl.coeff(index))
|
||||||
|
return m_thenImpl.coeff(index);
|
||||||
|
else
|
||||||
|
return m_elseImpl.coeff(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typename evaluator<ConditionMatrixType>::type m_conditionImpl;
|
||||||
|
typename evaluator<ThenMatrixType>::type m_thenImpl;
|
||||||
|
typename evaluator<ElseMatrixType>::type m_elseImpl;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
#endif // EIGEN_COREEVALUATORS_H
|
#endif // EIGEN_COREEVALUATORS_H
|
||||||
|
@ -101,6 +101,21 @@ class Select : internal::no_assignment_operator,
|
|||||||
return m_else.coeff(i);
|
return m_else.coeff(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ConditionMatrixType& conditionMatrix() const
|
||||||
|
{
|
||||||
|
return m_condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ThenMatrixType& thenMatrix() const
|
||||||
|
{
|
||||||
|
return m_then;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ElseMatrixType& elseMatrix() const
|
||||||
|
{
|
||||||
|
return m_else;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const typename ConditionMatrixType::Nested m_condition;
|
const typename ConditionMatrixType::Nested m_condition;
|
||||||
const typename ThenMatrixType::Nested m_then;
|
const typename ThenMatrixType::Nested m_then;
|
||||||
|
@ -164,4 +164,7 @@ void test_evaluators()
|
|||||||
matXcd_ref.real() = mat1;
|
matXcd_ref.real() = mat1;
|
||||||
matXcd_ref.imag() = mat2;
|
matXcd_ref.imag() = mat2;
|
||||||
VERIFY_IS_APPROX(matXcd, matXcd_ref);
|
VERIFY_IS_APPROX(matXcd, matXcd_ref);
|
||||||
|
|
||||||
|
// test Select
|
||||||
|
VERIFY_IS_APPROX_EVALUATOR(aX, (aXsrc > 0).select(aXsrc, -aXsrc));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user