mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-18 14:34:17 +08:00
add operators *= and /=
This commit is contained in:
parent
628b1a8f6d
commit
d99d9407df
@ -89,6 +89,22 @@ template<typename _Scalar, typename Derived> class EigenBase
|
||||
Derived& operator+=(const EigenBase<Scalar, OtherDerived>& other);
|
||||
template<typename OtherDerived>
|
||||
Derived& operator-=(const EigenBase<Scalar, OtherDerived>& other);
|
||||
template<typename OtherDerived>
|
||||
Derived& operator*=(const EigenBase<Scalar, OtherDerived>& other);
|
||||
|
||||
Derived& operator*=(const int& other);
|
||||
Derived& operator*=(const float& other);
|
||||
Derived& operator*=(const double& other);
|
||||
Derived& operator*=(const std::complex<int>& other);
|
||||
Derived& operator*=(const std::complex<float>& other);
|
||||
Derived& operator*=(const std::complex<double>& other);
|
||||
|
||||
Derived& operator/=(const int& other);
|
||||
Derived& operator/=(const float& other);
|
||||
Derived& operator/=(const double& other);
|
||||
Derived& operator/=(const std::complex<int>& other);
|
||||
Derived& operator/=(const std::complex<float>& other);
|
||||
Derived& operator/=(const std::complex<double>& other);
|
||||
|
||||
Scalar operator()(int row, int col = 0) const
|
||||
{ return read(row, col); }
|
||||
|
@ -86,6 +86,8 @@ class Matrix : public EigenBase<_Scalar, Matrix<_Scalar, _Rows, _Cols> >,
|
||||
|
||||
EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Matrix, +=)
|
||||
EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Matrix, -=)
|
||||
EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Matrix, *=)
|
||||
EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Matrix, /=)
|
||||
|
||||
explicit Matrix(int rows = 1, int cols = 1) : Storage(rows, cols) {}
|
||||
template<typename OtherDerived>
|
||||
|
@ -149,13 +149,6 @@ template<typename Lhs, typename Rhs> class MatrixProduct
|
||||
const RhsRef m_rhs;
|
||||
};
|
||||
|
||||
template<typename Scalar, typename Derived1, typename Derived2>
|
||||
MatrixProduct<Derived1, Derived2>
|
||||
operator*(const EigenBase<Scalar, Derived1> &mat1, const EigenBase<Scalar, Derived2> &mat2)
|
||||
{
|
||||
return MatrixProduct<Derived1, Derived2>(mat1.ref(), mat2.ref());
|
||||
}
|
||||
|
||||
template<typename Scalar, typename Derived1, typename Derived2>
|
||||
MatrixSum<Derived1, Derived2>
|
||||
operator+(const EigenBase<Scalar, Derived1> &mat1, const EigenBase<Scalar, Derived2> &mat2)
|
||||
@ -170,6 +163,13 @@ operator-(const EigenBase<Scalar, Derived1> &mat1, const EigenBase<Scalar, Deriv
|
||||
return MatrixDifference<Derived1, Derived2>(mat1.ref(), mat2.ref());
|
||||
}
|
||||
|
||||
template<typename Scalar, typename Derived1, typename Derived2>
|
||||
MatrixProduct<Derived1, Derived2>
|
||||
operator*(const EigenBase<Scalar, Derived1> &mat1, const EigenBase<Scalar, Derived2> &mat2)
|
||||
{
|
||||
return MatrixProduct<Derived1, Derived2>(mat1.ref(), mat2.ref());
|
||||
}
|
||||
|
||||
template<typename Scalar, typename Derived>
|
||||
template<typename OtherDerived>
|
||||
Derived &
|
||||
@ -188,6 +188,15 @@ EigenBase<Scalar, Derived>::operator-=(const EigenBase<Scalar, OtherDerived> &ot
|
||||
return *static_cast<Derived*>(this);
|
||||
}
|
||||
|
||||
template<typename Scalar, typename Derived>
|
||||
template<typename OtherDerived>
|
||||
Derived &
|
||||
EigenBase<Scalar, Derived>::operator*=(const EigenBase<Scalar, OtherDerived> &other)
|
||||
{
|
||||
*this = *this * other;
|
||||
return *static_cast<Derived*>(this);
|
||||
}
|
||||
|
||||
} // namespace Eigen
|
||||
|
||||
#endif // EIGEN_MATRIXOPS_H
|
||||
|
@ -86,6 +86,22 @@ operator/(const EigenBase<Scalar, Derived>& matrix, \
|
||||
OtherScalar scalar) \
|
||||
{ \
|
||||
return matrix * (static_cast<typename Derived::Scalar>(1) / scalar); \
|
||||
} \
|
||||
\
|
||||
template<typename Scalar, typename Derived> \
|
||||
Derived & \
|
||||
EigenBase<Scalar, Derived>::operator*=(const OtherScalar &other) \
|
||||
{ \
|
||||
*this = *this * other; \
|
||||
return *static_cast<Derived*>(this); \
|
||||
} \
|
||||
\
|
||||
template<typename Scalar, typename Derived> \
|
||||
Derived & \
|
||||
EigenBase<Scalar, Derived>::operator/=(const OtherScalar &other) \
|
||||
{ \
|
||||
*this = *this / other; \
|
||||
return *static_cast<Derived*>(this); \
|
||||
}
|
||||
|
||||
EIGEN_MAKE_SCALAR_OPS(int)
|
||||
|
@ -79,17 +79,27 @@ const int DynamicSize = -1;
|
||||
template<typename OtherScalar, typename OtherDerived> \
|
||||
Derived& operator Op(const EigenBase<OtherScalar, OtherDerived>& other) \
|
||||
{ \
|
||||
return EigenBase<OtherScalar, Derived>::operator Op(other); \
|
||||
return EigenBase<Scalar, Derived>::operator Op(other); \
|
||||
} \
|
||||
Derived& operator Op(const Derived& other) \
|
||||
{ \
|
||||
return EigenBase<Scalar, Derived>::operator Op(other); \
|
||||
}
|
||||
|
||||
#define EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \
|
||||
template<typename Other> \
|
||||
Derived& operator Op(const Other& scalar) \
|
||||
{ \
|
||||
return EigenBase<Scalar, Derived>::operator Op(scalar); \
|
||||
}
|
||||
|
||||
#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
|
||||
EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \
|
||||
EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \
|
||||
EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=)
|
||||
EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \
|
||||
EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \
|
||||
EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)
|
||||
|
||||
|
||||
} // namespace Eigen
|
||||
|
||||
|
@ -29,7 +29,7 @@ template<typename MatrixType> void matrixManip(const MatrixType& m)
|
||||
{
|
||||
int rows = m.rows(), cols = m.cols();
|
||||
int i = rand()%rows, j = rand()%cols;
|
||||
|
||||
|
||||
MatrixType a(rows, cols), b(rows, cols);
|
||||
a.row(i);
|
||||
a.col(j);
|
||||
@ -37,6 +37,7 @@ template<typename MatrixType> void matrixManip(const MatrixType& m)
|
||||
a.block(1, rows-1, 1, cols-1);
|
||||
a.row(i) = b.row(i);
|
||||
a.row(i) += b.row(i);
|
||||
a.col(j) *= 2;
|
||||
a.minor(i, j) = b.block(1, rows-1, 1, cols-1);
|
||||
a.minor(i, j) -= eval(a.block(1, rows-1, 1, cols-1));
|
||||
}
|
||||
|
@ -47,6 +47,9 @@ template<typename MatrixType1,
|
||||
a = eval(a + b);
|
||||
a += b;
|
||||
a -= b + b;
|
||||
a *= s;
|
||||
b /= s;
|
||||
if(rows1 == cols1) a *= b;
|
||||
|
||||
MatrixType1 d(rows1, cols1);
|
||||
MatrixType2 e(rows2, cols2);
|
||||
|
@ -45,7 +45,9 @@ template<typename VectorType> void vectorOps(const VectorType& v)
|
||||
a = eval(s * (b - c));
|
||||
|
||||
a += b;
|
||||
a += b + b;
|
||||
a -= b + b;
|
||||
a *= s;
|
||||
b /= s;
|
||||
a += eval(a + a);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user