Home | History | Annotate | Download | only in Eigen2Support
      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 (at) gmail.com>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 #ifndef EIGEN_MINOR_H
     11 #define EIGEN_MINOR_H
     12 
     13 namespace Eigen {
     14 
     15 /**
     16   * \class Minor
     17   *
     18   * \brief Expression of a minor
     19   *
     20   * \param MatrixType the type of the object in which we are taking a minor
     21   *
     22   * This class represents an expression of a minor. It is the return
     23   * type of MatrixBase::minor() and most of the time this is the only way it
     24   * is used.
     25   *
     26   * \sa MatrixBase::minor()
     27   */
     28 
     29 namespace internal {
     30 template<typename MatrixType>
     31 struct traits<Minor<MatrixType> >
     32  : traits<MatrixType>
     33 {
     34   typedef typename nested<MatrixType>::type MatrixTypeNested;
     35   typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
     36   typedef typename MatrixType::StorageKind StorageKind;
     37   enum {
     38     RowsAtCompileTime = (MatrixType::RowsAtCompileTime != Dynamic) ?
     39                           int(MatrixType::RowsAtCompileTime) - 1 : Dynamic,
     40     ColsAtCompileTime = (MatrixType::ColsAtCompileTime != Dynamic) ?
     41                           int(MatrixType::ColsAtCompileTime) - 1 : Dynamic,
     42     MaxRowsAtCompileTime = (MatrixType::MaxRowsAtCompileTime != Dynamic) ?
     43                              int(MatrixType::MaxRowsAtCompileTime) - 1 : Dynamic,
     44     MaxColsAtCompileTime = (MatrixType::MaxColsAtCompileTime != Dynamic) ?
     45                              int(MatrixType::MaxColsAtCompileTime) - 1 : Dynamic,
     46     Flags = _MatrixTypeNested::Flags & (HereditaryBits | LvalueBit),
     47     CoeffReadCost = _MatrixTypeNested::CoeffReadCost // minor is used typically on tiny matrices,
     48       // where loops are unrolled and the 'if' evaluates at compile time
     49   };
     50 };
     51 }
     52 
     53 template<typename MatrixType> class Minor
     54   : public MatrixBase<Minor<MatrixType> >
     55 {
     56   public:
     57 
     58     typedef MatrixBase<Minor> Base;
     59     EIGEN_DENSE_PUBLIC_INTERFACE(Minor)
     60 
     61     inline Minor(const MatrixType& matrix,
     62                        Index row, Index col)
     63       : m_matrix(matrix), m_row(row), m_col(col)
     64     {
     65       eigen_assert(row >= 0 && row < matrix.rows()
     66           && col >= 0 && col < matrix.cols());
     67     }
     68 
     69     EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Minor)
     70 
     71     inline Index rows() const { return m_matrix.rows() - 1; }
     72     inline Index cols() const { return m_matrix.cols() - 1; }
     73 
     74     inline Scalar& coeffRef(Index row, Index col)
     75     {
     76       return m_matrix.const_cast_derived().coeffRef(row + (row >= m_row), col + (col >= m_col));
     77     }
     78 
     79     inline const Scalar coeff(Index row, Index col) const
     80     {
     81       return m_matrix.coeff(row + (row >= m_row), col + (col >= m_col));
     82     }
     83 
     84   protected:
     85     const typename MatrixType::Nested m_matrix;
     86     const Index m_row, m_col;
     87 };
     88 
     89 /**
     90   * \return an expression of the (\a row, \a col)-minor of *this,
     91   * i.e. an expression constructed from *this by removing the specified
     92   * row and column.
     93   *
     94   * Example: \include MatrixBase_minor.cpp
     95   * Output: \verbinclude MatrixBase_minor.out
     96   *
     97   * \sa class Minor
     98   */
     99 template<typename Derived>
    100 inline Minor<Derived>
    101 MatrixBase<Derived>::minor(Index row, Index col)
    102 {
    103   return Minor<Derived>(derived(), row, col);
    104 }
    105 
    106 /**
    107   * This is the const version of minor(). */
    108 template<typename Derived>
    109 inline const Minor<Derived>
    110 MatrixBase<Derived>::minor(Index row, Index col) const
    111 {
    112   return Minor<Derived>(derived(), row, col);
    113 }
    114 
    115 } // end namespace Eigen
    116 
    117 #endif // EIGEN_MINOR_H
    118