123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- // This file is part of Eigen, a lightweight C++ template library
- // for linear algebra.
- //
- // Copyright (C) 2014 Gael Guennebaud <gael.guennebaud@inria.fr>
- //
- // This Source Code Form is subject to the terms of the Mozilla
- // Public License v. 2.0. If a copy of the MPL was not distributed
- // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #ifndef EIGEN_INVERSE_H
- #define EIGEN_INVERSE_H
- namespace Eigen {
- template<typename XprType,typename StorageKind> class InverseImpl;
- namespace internal {
- template<typename XprType>
- struct traits<Inverse<XprType> >
- : traits<typename XprType::PlainObject>
- {
- typedef typename XprType::PlainObject PlainObject;
- typedef traits<PlainObject> BaseTraits;
- enum {
- Flags = BaseTraits::Flags & RowMajorBit
- };
- };
- } // end namespace internal
- /** \class Inverse
- *
- * \brief Expression of the inverse of another expression
- *
- * \tparam XprType the type of the expression we are taking the inverse
- *
- * This class represents an abstract expression of A.inverse()
- * and most of the time this is the only way it is used.
- *
- */
- template<typename XprType>
- class Inverse : public InverseImpl<XprType,typename internal::traits<XprType>::StorageKind>
- {
- public:
- typedef typename XprType::StorageIndex StorageIndex;
- typedef typename XprType::PlainObject PlainObject;
- typedef typename XprType::Scalar Scalar;
- typedef typename internal::ref_selector<XprType>::type XprTypeNested;
- typedef typename internal::remove_all<XprTypeNested>::type XprTypeNestedCleaned;
- typedef typename internal::ref_selector<Inverse>::type Nested;
- typedef typename internal::remove_all<XprType>::type NestedExpression;
-
- explicit EIGEN_DEVICE_FUNC Inverse(const XprType &xpr)
- : m_xpr(xpr)
- {}
- EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); }
- EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); }
- EIGEN_DEVICE_FUNC const XprTypeNestedCleaned& nestedExpression() const { return m_xpr; }
- protected:
- XprTypeNested m_xpr;
- };
- // Generic API dispatcher
- template<typename XprType, typename StorageKind>
- class InverseImpl
- : public internal::generic_xpr_base<Inverse<XprType> >::type
- {
- public:
- typedef typename internal::generic_xpr_base<Inverse<XprType> >::type Base;
- typedef typename XprType::Scalar Scalar;
- private:
- Scalar coeff(Index row, Index col) const;
- Scalar coeff(Index i) const;
- };
- namespace internal {
- /** \internal
- * \brief Default evaluator for Inverse expression.
- *
- * This default evaluator for Inverse expression simply evaluate the inverse into a temporary
- * by a call to internal::call_assignment_no_alias.
- * Therefore, inverse implementers only have to specialize Assignment<Dst,Inverse<...>, ...> for
- * there own nested expression.
- *
- * \sa class Inverse
- */
- template<typename ArgType>
- struct unary_evaluator<Inverse<ArgType> >
- : public evaluator<typename Inverse<ArgType>::PlainObject>
- {
- typedef Inverse<ArgType> InverseType;
- typedef typename InverseType::PlainObject PlainObject;
- typedef evaluator<PlainObject> Base;
-
- enum { Flags = Base::Flags | EvalBeforeNestingBit };
- unary_evaluator(const InverseType& inv_xpr)
- : m_result(inv_xpr.rows(), inv_xpr.cols())
- {
- ::new (static_cast<Base*>(this)) Base(m_result);
- internal::call_assignment_no_alias(m_result, inv_xpr);
- }
-
- protected:
- PlainObject m_result;
- };
-
- } // end namespace internal
- } // end namespace Eigen
- #endif // EIGEN_INVERSE_H
|