mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-21 09:09:36 +08:00
bug #426: move operator && and || to MatrixBase and SparseMatrixBase.
This commit is contained in:
parent
a048aba14c
commit
2e334f5da0
@ -269,44 +269,6 @@ const CwiseBinaryOp<internal::scalar_difference_op<T,Scalar>,Constant<T>,Derived
|
|||||||
operator/(const T& s,const StorageBaseType& a);
|
operator/(const T& s,const StorageBaseType& a);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise && operator of *this and \a other
|
|
||||||
*
|
|
||||||
* \warning this operator is for expression of bool only.
|
|
||||||
*
|
|
||||||
* Example: \include Cwise_boolean_and.cpp
|
|
||||||
* Output: \verbinclude Cwise_boolean_and.out
|
|
||||||
*
|
|
||||||
* \sa operator||(), select()
|
|
||||||
*/
|
|
||||||
template<typename OtherDerived>
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
inline const CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>
|
|
||||||
operator&&(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
|
||||||
{
|
|
||||||
EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),
|
|
||||||
THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);
|
|
||||||
return CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>(derived(),other.derived());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise || operator of *this and \a other
|
|
||||||
*
|
|
||||||
* \warning this operator is for expression of bool only.
|
|
||||||
*
|
|
||||||
* Example: \include Cwise_boolean_or.cpp
|
|
||||||
* Output: \verbinclude Cwise_boolean_or.out
|
|
||||||
*
|
|
||||||
* \sa operator&&(), select()
|
|
||||||
*/
|
|
||||||
template<typename OtherDerived>
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
inline const CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>
|
|
||||||
operator||(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
|
||||||
{
|
|
||||||
EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),
|
|
||||||
THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);
|
|
||||||
return CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>(derived(),other.derived());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise ^ operator of *this and \a other
|
/** \returns an expression of the coefficient-wise ^ operator of *this and \a other
|
||||||
*
|
*
|
||||||
* \warning this operator is for expression of bool only.
|
* \warning this operator is for expression of bool only.
|
||||||
|
@ -75,3 +75,41 @@ EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(operator/,quotient)
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
const CwiseBinaryOp<internal::scalar_quotient_op<Scalar,T>,Derived,Constant<T> > operator/(const T& scalar) const;
|
const CwiseBinaryOp<internal::scalar_quotient_op<Scalar,T>,Derived,Constant<T> > operator/(const T& scalar) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/** \returns an expression of the coefficient-wise boolean \b and operator of \c *this and \a other
|
||||||
|
*
|
||||||
|
* \warning this operator is for expression of bool only.
|
||||||
|
*
|
||||||
|
* Example: \include Cwise_boolean_and.cpp
|
||||||
|
* Output: \verbinclude Cwise_boolean_and.out
|
||||||
|
*
|
||||||
|
* \sa operator||(), select()
|
||||||
|
*/
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
inline const CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>
|
||||||
|
operator&&(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),
|
||||||
|
THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);
|
||||||
|
return CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>(derived(),other.derived());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns an expression of the coefficient-wise boolean \b or operator of \c *this and \a other
|
||||||
|
*
|
||||||
|
* \warning this operator is for expression of bool only.
|
||||||
|
*
|
||||||
|
* Example: \include Cwise_boolean_or.cpp
|
||||||
|
* Output: \verbinclude Cwise_boolean_or.out
|
||||||
|
*
|
||||||
|
* \sa operator&&(), select()
|
||||||
|
*/
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
inline const CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>
|
||||||
|
operator||(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),
|
||||||
|
THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);
|
||||||
|
return CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>(derived(),other.derived());
|
||||||
|
}
|
||||||
|
@ -134,6 +134,12 @@ template<typename MatrixType> void comparisons(const MatrixType& m)
|
|||||||
// count
|
// count
|
||||||
VERIFY(((m1.array().abs()+1)>RealScalar(0.1)).count() == rows*cols);
|
VERIFY(((m1.array().abs()+1)>RealScalar(0.1)).count() == rows*cols);
|
||||||
|
|
||||||
|
// and/or
|
||||||
|
VERIFY( ((m1.array()<RealScalar(0)).matrix() && (m1.array()>RealScalar(0)).matrix()).count() == 0);
|
||||||
|
VERIFY( ((m1.array()<RealScalar(0)).matrix() || (m1.array()>=RealScalar(0)).matrix()).count() == rows*cols);
|
||||||
|
RealScalar a = m1.cwiseAbs().mean();
|
||||||
|
VERIFY( ((m1.array()<-a).matrix() || (m1.array()>a).matrix()).count() == (m1.cwiseAbs().array()>a).count());
|
||||||
|
|
||||||
typedef Matrix<typename MatrixType::Index, Dynamic, 1> VectorOfIndices;
|
typedef Matrix<typename MatrixType::Index, Dynamic, 1> VectorOfIndices;
|
||||||
|
|
||||||
// TODO allows colwise/rowwise for array
|
// TODO allows colwise/rowwise for array
|
||||||
|
@ -217,6 +217,21 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
refM1(it.row(), it.col()) += s1;
|
refM1(it.row(), it.col()) += s1;
|
||||||
VERIFY_IS_APPROX(m1, refM1);
|
VERIFY_IS_APPROX(m1, refM1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// and/or
|
||||||
|
{
|
||||||
|
typedef SparseMatrix<bool, SparseMatrixType::Options, typename SparseMatrixType::StorageIndex> SpBool;
|
||||||
|
SpBool mb1 = m1.real().template cast<bool>();
|
||||||
|
SpBool mb2 = m2.real().template cast<bool>();
|
||||||
|
VERIFY_IS_EQUAL(mb1.template cast<int>().sum(), refM1.real().template cast<bool>().count());
|
||||||
|
VERIFY_IS_EQUAL((mb1 && mb2).template cast<int>().sum(), (refM1.real().template cast<bool>() && refM2.real().template cast<bool>()).count());
|
||||||
|
VERIFY_IS_EQUAL((mb1 || mb2).template cast<int>().sum(), (refM1.real().template cast<bool>() || refM2.real().template cast<bool>()).count());
|
||||||
|
SpBool mb3 = mb1 && mb2;
|
||||||
|
if(mb1.coeffs().all() && mb2.coeffs().all())
|
||||||
|
{
|
||||||
|
VERIFY_IS_EQUAL(mb3.nonZeros(), (refM1.real().template cast<bool>() && refM2.real().template cast<bool>()).count());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// test reverse iterators
|
// test reverse iterators
|
||||||
|
Loading…
x
Reference in New Issue
Block a user