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