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