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-2008 Benoit Jacob <jacob.benoit.1@gmail.com> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_IO_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_IO_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathenum { DontAlignCols = 1 }; 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathenum { StreamPrecision = -1, 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath FullPrecision = -2 }; 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt); 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class IOFormat 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Stores a set of parameters controlling the way matrices are printed 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * List of available parameters: 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c FullPrecision. 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The default is the special value \c StreamPrecision which means to use the 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * stream's own precision setting, as set for instance using \c cout.precision(3). The other special value 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \c FullPrecision means that the number of digits will be computed to match the full precision of each floating-point 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * type. 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c DontAlignCols which 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * allows to disable the alignment of columns, resulting in faster code. 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b coeffSeparator string printed between two coefficients of the same row 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b rowSeparator string printed between two rows 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b rowPrefix string printed at the beginning of each row 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b rowSuffix string printed at the end of each row 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b matPrefix string printed at the beginning of the matrix 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - \b matSuffix string printed at the end of the matrix 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include IOFormat.cpp 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude IOFormat.out 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format(), class WithFormat 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct IOFormat 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang /** Default constructor, see class IOFormat for the meaning of the parameters */ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IOFormat(int _precision = StreamPrecision, int _flags = 0, 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const std::string& _coeffSeparator = " ", 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const std::string& _rowSeparator = "\n", const std::string& _rowPrefix="", const std::string& _rowSuffix="", 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const std::string& _matPrefix="", const std::string& _matSuffix="") 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator), 587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez rowSpacer(""), coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags) 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // TODO check if rowPrefix, rowSuffix or rowSeparator contains a newline 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // don't add rowSpacer if columns are not to be aligned 622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if((flags & DontAlignCols)) 632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int i = int(matSuffix.length())-1; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while (i>=0 && matSuffix[i]!='\n') 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath rowSpacer += ' '; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath i--; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string matPrefix, matSuffix; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string coeffSeparator; 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int precision; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int flags; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class WithFormat 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Pseudo expression providing matrix output with given format 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \tparam ExpressionType the type of the object on which IO stream operations are performed 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents an expression with stream operators controlled by a given IOFormat. 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is the return type of DenseBase::format() 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and most of the time this is the only way it is used. 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * See class IOFormat for some examples. 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format(), class IOFormat 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass WithFormat 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WithFormat(const ExpressionType& matrix, const IOFormat& format) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_matrix(matrix), m_format(format) 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator << (std::ostream & s, const WithFormat& wf) 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format); 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typename ExpressionType::Nested m_matrix; 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IOFormat m_format; 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// NOTE: This helper is kept for backward compatibility with previous code specializing 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// this internal::significant_decimals_impl structure. In the future we should directly 1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// call digits10() which has been introduced in July 2016 in 3.3. 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct significant_decimals_impl 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline int run() 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return NumTraits<Scalar>::digits10(); 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * print the matrix \a _m to the output stream \a s using the output format \a fmt */ 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt) 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(_m.size() == 0) 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matPrefix << fmt.matSuffix; 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Derived::Nested m = _m; 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Derived::Scalar Scalar; 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index width = 0; 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::streamsize explicit_precision; 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(fmt.precision == StreamPrecision) 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = 0; 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(fmt.precision == FullPrecision) 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (NumTraits<Scalar>::IsInteger) 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = 0; 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = significant_decimals_impl<Scalar>::run(); 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = fmt.precision; 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::streamsize old_precision = 0; 1647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(explicit_precision) old_precision = s.precision(explicit_precision); 1657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool align_cols = !(fmt.flags & DontAlignCols); 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(align_cols) 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // compute the largest width 1707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(Index j = 0; j < m.cols(); ++j) 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.rows(); ++i) 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::stringstream sstr; 1747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez sstr.copyfmt(s); 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sstr << m.coeff(i,j); 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath width = std::max<Index>(width, Index(sstr.str().length())); 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matPrefix; 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.rows(); ++i) 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (i) 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSpacer; 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowPrefix; 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(width) s.width(width); 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.coeff(i, 0); 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 1; j < m.cols(); ++j) 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.coeffSeparator; 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (width) s.width(width); 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.coeff(i, j); 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSuffix; 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if( i < m.rows() - 1) 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSeparator; 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matSuffix; 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(explicit_precision) s.precision(old_precision); 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \relates DenseBase 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outputs the matrix, to the given stream. 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If you wish to print the matrix with a format different than the default, use DenseBase::format(). 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers. 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters. 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format() 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::ostream & operator << 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath(std::ostream & s, 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DenseBase<Derived> & m) 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT); 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_IO_H 226