diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-10-07 14:26:42 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-10-07 14:26:42 +0200 |
commit | 81a70cef5c646ba64d53948ad08e387d618d1656 (patch) | |
tree | c09caa62d5b43ade522fe28b1c570226d29e16fd /Eigen | |
parent | 8f3e33581ecd69eea782d4103985a808ed41dabd (diff) | |
parent | 9115d33fae9af9899bf3f93949946e625769890f (diff) |
merge
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 6 | ||||
-rw-r--r-- | Eigen/src/LU/Inverse.h | 74 |
2 files changed, 42 insertions, 38 deletions
diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index 5ae2b0002..387c11385 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -702,8 +702,10 @@ template<typename Derived> class MatrixBase const LU<PlainMatrixType> lu() const; const PartialLU<PlainMatrixType> partialLu() const; const PlainMatrixType inverse() const; - void computeInverse(PlainMatrixType *result) const; - bool computeInverseWithCheck( PlainMatrixType *result ) const; + template<typename ResultType> + void computeInverse(ResultType *result) const; + template<typename ResultType> + bool computeInverseWithCheck(ResultType *result ) const; Scalar determinant() const; /////////// Cholesky module /////////// diff --git a/Eigen/src/LU/Inverse.h b/Eigen/src/LU/Inverse.h index 248b48044..3255c1022 100644 --- a/Eigen/src/LU/Inverse.h +++ b/Eigen/src/LU/Inverse.h @@ -95,8 +95,8 @@ bool ei_compute_inverse_size3(const XprType& matrix, MatrixType* result) return true; } -template<typename MatrixType> -bool ei_compute_inverse_size4_helper(const MatrixType& matrix, MatrixType* result) +template<typename MatrixType, typename ResultType> +bool ei_compute_inverse_size4_helper(const MatrixType& matrix, ResultType* result) { /* Let's split M into four 2x2 blocks: * (P Q) @@ -195,47 +195,47 @@ bool ei_compute_inverse_size4_with_check(const XprType& matrix, MatrixType* resu *** Part 2 : selector and MatrixBase methods *** ***********************************************/ -template<typename MatrixType, int Size = MatrixType::RowsAtCompileTime> +template<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime> struct ei_compute_inverse { - static inline void run(const MatrixType& matrix, MatrixType* result) + static inline void run(const MatrixType& matrix, ResultType* result) { matrix.partialLu().computeInverse(result); } }; -template<typename MatrixType> -struct ei_compute_inverse<MatrixType, 1> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse<MatrixType, ResultType, 1> { - static inline void run(const MatrixType& matrix, MatrixType* result) + static inline void run(const MatrixType& matrix, ResultType* result) { typedef typename MatrixType::Scalar Scalar; result->coeffRef(0,0) = Scalar(1) / matrix.coeff(0,0); } }; -template<typename MatrixType> -struct ei_compute_inverse<MatrixType, 2> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse<MatrixType, ResultType, 2> { - static inline void run(const MatrixType& matrix, MatrixType* result) + static inline void run(const MatrixType& matrix, ResultType* result) { ei_compute_inverse_size2(matrix, result); } }; -template<typename MatrixType> -struct ei_compute_inverse<MatrixType, 3> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse<MatrixType, ResultType, 3> { - static inline void run(const MatrixType& matrix, MatrixType* result) + static inline void run(const MatrixType& matrix, ResultType* result) { - ei_compute_inverse_size3<false, MatrixType, MatrixType>(matrix, result); + ei_compute_inverse_size3<false, MatrixType, ResultType>(matrix, result); } }; -template<typename MatrixType> -struct ei_compute_inverse<MatrixType, 4> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse<MatrixType, ResultType, 4> { - static inline void run(const MatrixType& matrix, MatrixType* result) + static inline void run(const MatrixType& matrix, ResultType* result) { ei_compute_inverse_size4_with_check(matrix, result); } @@ -256,11 +256,12 @@ struct ei_compute_inverse<MatrixType, 4> * \sa inverse(), computeInverseWithCheck() */ template<typename Derived> -inline void MatrixBase<Derived>::computeInverse(PlainMatrixType *result) const +template<typename ResultType> +inline void MatrixBase<Derived>::computeInverse(ResultType *result) const { ei_assert(rows() == cols()); EIGEN_STATIC_ASSERT(NumTraits<Scalar>::HasFloatingPoint,NUMERIC_TYPE_MUST_BE_FLOATING_POINT) - ei_compute_inverse<PlainMatrixType>::run(eval(), result); + ei_compute_inverse<PlainMatrixType, ResultType>::run(eval(), result); } /** \lu_module @@ -291,10 +292,10 @@ inline const typename MatrixBase<Derived>::PlainMatrixType MatrixBase<Derived>:: * Compute inverse with invertibility check * *******************************************/ -template<typename MatrixType, int Size = MatrixType::RowsAtCompileTime> +template<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime> struct ei_compute_inverse_with_check { - static inline bool run(const MatrixType& matrix, MatrixType* result) + static inline bool run(const MatrixType& matrix, ResultType* result) { typedef typename MatrixType::Scalar Scalar; LU<MatrixType> lu( matrix ); @@ -304,10 +305,10 @@ struct ei_compute_inverse_with_check } }; -template<typename MatrixType> -struct ei_compute_inverse_with_check<MatrixType, 1> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse_with_check<MatrixType, ResultType, 1> { - static inline bool run(const MatrixType& matrix, MatrixType* result) + static inline bool run(const MatrixType& matrix, ResultType* result) { typedef typename MatrixType::Scalar Scalar; if( matrix.coeff(0,0) == Scalar(0) ) return false; @@ -316,28 +317,28 @@ struct ei_compute_inverse_with_check<MatrixType, 1> } }; -template<typename MatrixType> -struct ei_compute_inverse_with_check<MatrixType, 2> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse_with_check<MatrixType, ResultType, 2> { - static inline bool run(const MatrixType& matrix, MatrixType* result) + static inline bool run(const MatrixType& matrix, ResultType* result) { return ei_compute_inverse_size2_with_check(matrix, result); } }; -template<typename MatrixType> -struct ei_compute_inverse_with_check<MatrixType, 3> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse_with_check<MatrixType, ResultType, 3> { - static inline bool run(const MatrixType& matrix, MatrixType* result) + static inline bool run(const MatrixType& matrix, ResultType* result) { - return ei_compute_inverse_size3<true, MatrixType, MatrixType>(matrix, result); + return ei_compute_inverse_size3<true, MatrixType, ResultType>(matrix, result); } }; -template<typename MatrixType> -struct ei_compute_inverse_with_check<MatrixType, 4> +template<typename MatrixType, typename ResultType> +struct ei_compute_inverse_with_check<MatrixType, ResultType, 4> { - static inline bool run(const MatrixType& matrix, MatrixType* result) + static inline bool run(const MatrixType& matrix, ResultType* result) { return ei_compute_inverse_size4_with_check(matrix, result); } @@ -354,11 +355,12 @@ struct ei_compute_inverse_with_check<MatrixType, 4> * \sa inverse(), computeInverse() */ template<typename Derived> -inline bool MatrixBase<Derived>::computeInverseWithCheck(PlainMatrixType *result) const +template<typename ResultType> +inline bool MatrixBase<Derived>::computeInverseWithCheck(ResultType *result) const { ei_assert(rows() == cols()); EIGEN_STATIC_ASSERT(NumTraits<Scalar>::HasFloatingPoint,NUMERIC_TYPE_MUST_BE_FLOATING_POINT) - return ei_compute_inverse_with_check<PlainMatrixType>::run(eval(), result); + return ei_compute_inverse_with_check<PlainMatrixType, ResultType>::run(eval(), result); } |