SkylineMatrixBase.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr> 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_SKYLINEMATRIXBASE_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SKYLINEMATRIXBASE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "SkylineUtil.h" 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup Skyline_Module 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class SkylineMatrixBase 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Base class of any skyline matrices or skyline expressions 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Derived 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> { 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic: 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::index<StorageKind>::type Index; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime, 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< The number of rows at compile-time. This is just a copy of the value provided 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * by the \a Derived type. If a value is not known at compile-time, 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is set to the \a Dynamic constant. 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */ 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime, 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< The number of columns at compile-time. This is just a copy of the value provided 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * by the \a Derived type. If a value is not known at compile-time, 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is set to the \a Dynamic constant. 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime, 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::traits<Derived>::ColsAtCompileTime>::ret), 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This is equal to the number of coefficients, i.e. the number of 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * rows times the number of columns, or to \a Dynamic if this is not 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = RowsAtCompileTime, 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = ColsAtCompileTime, 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime, 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime>::ret), 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1, 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This is set to true if either the number of rows or the number of 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * columns is known at compile-time to be equal to 1. Indeed, in that case, 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * we are dealing with a column-vector (if there is only one column) or with 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a row-vector (if there is only one row). */ 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = internal::traits<Derived>::Flags, 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This stores expression \ref flags flags which may or may not be inherited by new expressions 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * constructed from this one. See the \ref flags "list of flags". 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = internal::traits<Derived>::CoeffReadCost, 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This is a rough measure of how expensive it is to read one coefficient from 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * this expression. 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsRowMajor = Flags & RowMajorBit ? 1 : 0 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** This is the "real scalar" type; if the \a Scalar type is already real numbers 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \a Scalar is \a std::complex<T> then RealScalar is \a T. 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class NumTraits 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** type of the equivalent square matrix */ 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime), 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType; 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Derived& derived() const { 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *static_cast<const Derived*> (this); 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& derived() { 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *static_cast<Derived*> (this); 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& const_cast_derived() const { 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this)); 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().rows(); 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/ 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().cols(); 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of coefficients, which is \a rows()*cols(). 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa rows(), cols(), SizeAtCompileTime. */ 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index size() const { 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return rows() * cols(); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of nonzero coefficients which is in practice the number 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * of stored coefficients. */ 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index nonZeros() const { 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().nonZeros(); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the size of the storage major dimension, 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */ 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index outerSize() const { 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return (int(Flags) & RowMajorBit) ? this->rows() : this->cols(); 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the size of the inner dimension according to the storage order, 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */ 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index innerSize() const { 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return (int(Flags) & RowMajorBit) ? this->cols() : this->rows(); 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isRValue() const { 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_isRValue; 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& markAsRValue() { 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_isRValue = true; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SkylineMatrixBase() : m_isRValue(false) { 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /* TODO check flags */ 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived & operator=(const Derived& other) { 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath this->operator=<Derived > (other); 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void assignGeneric(const OtherDerived& other) { 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().resize(other.rows(), other.cols()); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index row = 0; row < rows(); row++) 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index col = 0; col < cols(); col++) { 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (other.coeff(row, col) != Scalar(0)) 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().insert(row, col) = other.coeff(row, col); 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().finalize(); 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) { 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //TODO 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Lhs, typename Rhs> 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product); 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) { 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.derived(); 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename SkylineProductReturnType<Derived, OtherDerived>::Type 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const MatrixBase<OtherDerived> &other) const; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal use operator= */ 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename DenseDerived> 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void evalTo(MatrixBase<DenseDerived>& dst) const { 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.setZero(); 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i = 0; i < rows(); i++) 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j = 0; j < rows(); j++) 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst(i, j) = derived().coeff(i, j); 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const { 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the matrix or vector obtained by evaluating this expression. 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Notice that in the case of a plain matrix or vector (not an expression) this function just returns 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a const reference, in order to avoid a useless copy. 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const { 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename internal::eval<Derived>::type(derived()); 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected: 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool m_isRValue; 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SkylineMatrixBase_H 213