mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Add operator += and operator -= between matrices/vectors/expressions
This commit is contained in:
@@ -202,6 +202,16 @@ class MatrixBase
|
||||
MatrixConstXpr<MatrixBlock<const ConstRef> >
|
||||
block(int startRow, int endRow, int startCol = 0, int endCol = 0) const;
|
||||
|
||||
template<typename Content>
|
||||
MatrixBase& operator+=(const MatrixConstXpr<Content> &xpr);
|
||||
template<typename Content>
|
||||
MatrixBase& operator-=(const MatrixConstXpr<Content> &xpr);
|
||||
template<typename Derived2>
|
||||
MatrixBase& operator+=(const MatrixBase<Derived2> &other);
|
||||
template<typename Derived2>
|
||||
MatrixBase& operator-=(const MatrixBase<Derived2> &other);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
MatrixBase() {};
|
||||
|
||||
@@ -167,6 +167,54 @@ EIGEN_MAKE_MATRIX_OP(Product, *)
|
||||
|
||||
#undef EIGEN_MAKE_MATRIX_OP
|
||||
|
||||
#define EIGEN_MAKE_MATRIX_OP_EQ(SYMBOL) \
|
||||
template<typename Derived1> \
|
||||
template<typename Derived2> \
|
||||
MatrixBase<Derived1> & \
|
||||
MatrixBase<Derived1>::operator SYMBOL##=(const MatrixBase<Derived2> &mat2) \
|
||||
{ \
|
||||
return *this = *this SYMBOL mat2; \
|
||||
} \
|
||||
\
|
||||
template<typename Derived> \
|
||||
template<typename Content> \
|
||||
MatrixBase<Derived> & \
|
||||
MatrixBase<Derived>::operator SYMBOL##=(const MatrixConstXpr<Content> &xpr) \
|
||||
{ \
|
||||
return *this = *this SYMBOL xpr; \
|
||||
} \
|
||||
\
|
||||
template<typename Content> \
|
||||
template<typename Derived> \
|
||||
MatrixXpr<Content> & \
|
||||
MatrixXpr<Content>::operator SYMBOL##=(const MatrixBase<Derived> &mat) \
|
||||
{ \
|
||||
assert(rows() == mat.rows() && cols() == mat.cols()); \
|
||||
for(int i = 0; i < rows(); i++) \
|
||||
for(int j = 0; j < cols(); j++) \
|
||||
this->operator()(i, j) SYMBOL##= mat(i, j); \
|
||||
return *this; \
|
||||
} \
|
||||
\
|
||||
template<typename Content1> \
|
||||
template<typename Content2> \
|
||||
MatrixXpr<Content1> & \
|
||||
MatrixXpr<Content1>::operator SYMBOL##=(const MatrixConstXpr<Content2> &other) \
|
||||
{ \
|
||||
assert(rows() == other.rows() && cols() == other.cols()); \
|
||||
for(int i = 0; i < rows(); i++) \
|
||||
for(int j = 0; j < cols(); j++) \
|
||||
this->operator()(i, j) SYMBOL##= other(i, j); \
|
||||
return *this; \
|
||||
}
|
||||
|
||||
EIGEN_MAKE_MATRIX_OP_EQ(+)
|
||||
EIGEN_MAKE_MATRIX_OP_EQ(-)
|
||||
|
||||
#undef EIGEN_MAKE_MATRIX_OP_EQ
|
||||
|
||||
|
||||
|
||||
} // namespace Eigen
|
||||
|
||||
#endif // EIGEN_MATRIXOPS_H
|
||||
|
||||
@@ -114,6 +114,17 @@ template<typename Content> class MatrixXpr
|
||||
MatrixXpr<MatrixMinor<MatrixXpr<Content> > > minor(int row, int col);
|
||||
MatrixXpr<MatrixBlock<MatrixXpr<Content> > >
|
||||
block(int startRow, int endRow, int startCol= 0, int endCol = 0);
|
||||
|
||||
template<typename Content2>
|
||||
MatrixXpr& operator+=(const MatrixConstXpr<Content2> &other);
|
||||
template<typename Content2>
|
||||
MatrixXpr& operator-=(const MatrixConstXpr<Content2> &other);
|
||||
template<typename Derived>
|
||||
MatrixXpr& operator+=(const MatrixBase<Derived> &matrix);
|
||||
template<typename Derived>
|
||||
MatrixXpr& operator-=(const MatrixBase<Derived> &matrix);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
void operator=(const MatrixXpr &other)
|
||||
|
||||
Reference in New Issue
Block a user