diff options
author | 2008-11-14 09:55:25 +0000 | |
---|---|---|
committer | 2008-11-14 09:55:25 +0000 | |
commit | 139529e97b76c250c13474a1ebc9f6dbf27b6115 (patch) | |
tree | 78451fa6c5aed1804788188b2076c6e3d690d03b /Eigen/src | |
parent | 86ccd99d8d9a87d03f2f327766a02cc13849b54d (diff) |
* add .imag() function
* fix a very old bug in EigenSolver that I had completely forgotten
(thanks to Timothy to refresh my mind)
* fix doc of Matrix::Map
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/Core/CwiseUnaryOp.h | 14 | ||||
-rw-r--r-- | Eigen/src/Core/Functors.h | 16 | ||||
-rw-r--r-- | Eigen/src/Core/Matrix.h | 6 | ||||
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 3 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 1 | ||||
-rw-r--r-- | Eigen/src/QR/EigenSolver.h | 17 |
6 files changed, 39 insertions, 18 deletions
diff --git a/Eigen/src/Core/CwiseUnaryOp.h b/Eigen/src/Core/CwiseUnaryOp.h index a50a9c30d..4ceb6d98a 100644 --- a/Eigen/src/Core/CwiseUnaryOp.h +++ b/Eigen/src/Core/CwiseUnaryOp.h @@ -174,13 +174,17 @@ MatrixBase<Derived>::conjugate() const /** \returns an expression of the real part of \c *this. * - * \sa adjoint() */ + * \sa imag() */ template<typename Derived> inline const typename MatrixBase<Derived>::RealReturnType -MatrixBase<Derived>::real() const -{ - return derived(); -} +MatrixBase<Derived>::real() const { return derived(); } + +/** \returns an expression of the imaginary part of \c *this. + * + * \sa real() */ +template<typename Derived> +inline const typename MatrixBase<Derived>::ImagReturnType +MatrixBase<Derived>::imag() const { return derived(); } /** \returns an expression of *this with the \a Scalar type casted to * \a NewScalar. diff --git a/Eigen/src/Core/Functors.h b/Eigen/src/Core/Functors.h index 4295aa4da..d68558e7b 100644 --- a/Eigen/src/Core/Functors.h +++ b/Eigen/src/Core/Functors.h @@ -240,7 +240,21 @@ struct ei_scalar_real_op EIGEN_EMPTY_STRUCT { }; template<typename Scalar> struct ei_functor_traits<ei_scalar_real_op<Scalar> > -{ enum { Cost = 0, PacketAccess = false }; }; +{ enum { Cost = 0, PacketAccess = false }; }; + +/** \internal + * \brief Template functor to extract the imaginary part of a complex + * + * \sa class CwiseUnaryOp, MatrixBase::imag() + */ +template<typename Scalar> +struct ei_scalar_imag_op EIGEN_EMPTY_STRUCT { + typedef typename NumTraits<Scalar>::Real result_type; + inline result_type operator() (const Scalar& a) const { return ei_imag(a); } +}; +template<typename Scalar> +struct ei_functor_traits<ei_scalar_imag_op<Scalar> > +{ enum { Cost = 0, PacketAccess = false }; }; /** \internal * \brief Template functor to multiply a scalar by a fixed other one diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h index 335150318..ba24b4b19 100644 --- a/Eigen/src/Core/Matrix.h +++ b/Eigen/src/Core/Matrix.h @@ -437,14 +437,14 @@ class Matrix this->Base::swap(other); } - /** + /** \name Map * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects, * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned * \a data pointers. - * + * * \see class Map */ - //@} + //@{ inline static const UnalignedMapType Map(const Scalar* data) { return UnalignedMapType(data); } inline static UnalignedMapType Map(Scalar* data) diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index dbf8da544..d231f973c 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -189,6 +189,8 @@ template<typename Derived> class MatrixBase >::ret ConjugateReturnType; /** \internal the return type of MatrixBase::real() */ typedef CwiseUnaryOp<ei_scalar_real_op<Scalar>, Derived> RealReturnType; + /** \internal the return type of MatrixBase::imag() */ + typedef CwiseUnaryOp<ei_scalar_imag_op<Scalar>, Derived> ImagReturnType; /** \internal the return type of MatrixBase::adjoint() */ typedef Eigen::Transpose<NestByValue<typename ei_cleantype<ConjugateReturnType>::type> > AdjointReturnType; @@ -496,6 +498,7 @@ template<typename Derived> class MatrixBase ConjugateReturnType conjugate() const; const RealReturnType real() const; + const ImagReturnType imag() const; template<typename CustomUnaryOp> const CwiseUnaryOp<CustomUnaryOp, Derived> unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const; diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index 98d15b415..0d2a457b6 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -64,6 +64,7 @@ template<typename Scalar> struct ei_scalar_quotient_op; template<typename Scalar> struct ei_scalar_opposite_op; template<typename Scalar> struct ei_scalar_conjugate_op; template<typename Scalar> struct ei_scalar_real_op; +template<typename Scalar> struct ei_scalar_imag_op; template<typename Scalar> struct ei_scalar_abs_op; template<typename Scalar> struct ei_scalar_abs2_op; template<typename Scalar> struct ei_scalar_sqrt_op; diff --git a/Eigen/src/QR/EigenSolver.h b/Eigen/src/QR/EigenSolver.h index d7d891951..38a383f14 100644 --- a/Eigen/src/QR/EigenSolver.h +++ b/Eigen/src/QR/EigenSolver.h @@ -59,7 +59,7 @@ template<typename _MatrixType> class EigenSolver compute(matrix); } - + EigenvectorType eigenvectors(void) const; /** \returns a real matrix V of pseudo eigenvectors. @@ -200,18 +200,18 @@ void EigenSolver<MatrixType>::orthes(MatrixType& matH, RealVectorType& ort) for (int m = low+1; m <= high-1; m++) { // Scale column. - Scalar scale = matH.block(m, m-1, high-m+1, 1).cwise().abs().sum(); + RealScalar scale = matH.block(m, m-1, high-m+1, 1).cwise().abs().sum(); if (scale != 0.0) { // Compute Householder transformation. - Scalar h = 0.0; + RealScalar h = 0.0; // FIXME could be rewritten, but this one looks better wrt cache for (int i = high; i >= m; i--) { ort.coeffRef(i) = matH.coeff(i,m-1)/scale; h += ort.coeff(i) * ort.coeff(i); } - Scalar g = ei_sqrt(h); + RealScalar g = ei_sqrt(h); if (ort.coeff(m) > 0) g = -g; h = h - ort.coeff(m) * g; @@ -247,7 +247,6 @@ void EigenSolver<MatrixType>::orthes(MatrixType& matH, RealVectorType& ort) } } - // Complex scalar division. template<typename Scalar> std::complex<Scalar> cdiv(Scalar xr, Scalar xi, Scalar yr, Scalar yi) @@ -298,7 +297,7 @@ void EigenSolver<MatrixType>::hqr2(MatrixType& matH) m_eivalues.coeffRef(j).real() = matH.coeff(j,j); m_eivalues.coeffRef(j).imag() = 0.0; } - norm += matH.col(j).start(std::min(j+1,nn)).cwise().abs().sum(); + norm += matH.row(j).segment(std::max(j-1,0), nn-std::max(j-1,0)).cwise().abs().sum(); } // Outer loop over eigenvalue index @@ -571,7 +570,7 @@ void EigenSolver<MatrixType>::hqr2(MatrixType& matH) for (int i = n-1; i >= 0; i--) { w = matH.coeff(i,i) - p; - r = (matH.row(i).end(nn-l) * matH.col(n).end(nn-l))(0,0); + r = (matH.row(i).segment(l,n-l+1) * matH.col(n).segment(l, n-l+1))(0,0); if (m_eivalues.coeff(i).imag() < 0.0) { @@ -630,8 +629,8 @@ void EigenSolver<MatrixType>::hqr2(MatrixType& matH) for (int i = n-2; i >= 0; i--) { Scalar ra,sa,vr,vi; - ra = (matH.row(i).end(nn-l) * matH.col(n-1).end(nn-l)).lazy()(0,0); - sa = (matH.row(i).end(nn-l) * matH.col(n).end(nn-l)).lazy()(0,0); + ra = (matH.block(i,l, 1, n-l+1) * matH.block(l,n-1, n-l+1, 1)).lazy()(0,0); + sa = (matH.block(i,l, 1, n-l+1) * matH.block(l,n, n-l+1, 1)).lazy()(0,0); w = matH.coeff(i,i) - p; if (m_eivalues.coeff(i).imag() < 0.0) |