IO.h revision 7faaa9f3f0df9d23790277834d426c3d992ac3ba
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{ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Default contructor, 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 { 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int i = int(matSuffix.length())-1; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while (i>=0 && matSuffix[i]!='\n') 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath rowSpacer += ' '; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath i--; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string matPrefix, matSuffix; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string coeffSeparator; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int precision; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int flags; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class WithFormat 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Pseudo expression providing matrix output with given format 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param ExpressionType the type of the object on which IO stream operations are performed 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents an expression with stream operators controlled by a given IOFormat. 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is the return type of DenseBase::format() 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and most of the time this is the only way it is used. 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * See class IOFormat for some examples. 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format(), class IOFormat 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass WithFormat 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WithFormat(const ExpressionType& matrix, const IOFormat& format) 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_matrix(matrix), m_format(format) 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator << (std::ostream & s, const WithFormat& wf) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format); 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename ExpressionType::Nested m_matrix; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IOFormat m_format; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a WithFormat proxy object allowing to print a matrix the with given 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * format \a fmt. 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * See class IOFormat for some examples. 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class IOFormat, class WithFormat 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const WithFormat<Derived> 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::format(const IOFormat& fmt) const 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return WithFormat<Derived>(derived(), fmt); 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, bool IsInteger> 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct significant_decimals_default_impl 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline int run() 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::ceil; 1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::log; 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return cast<RealScalar,int>(ceil(-log(NumTraits<RealScalar>::epsilon())/log(RealScalar(10)))); 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct significant_decimals_default_impl<Scalar, true> 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline int run() 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct significant_decimals_impl 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : significant_decimals_default_impl<Scalar, NumTraits<Scalar>::IsInteger> 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{}; 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * print the matrix \a _m to the output stream \a s using the output format \a fmt */ 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt) 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(_m.size() == 0) 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matPrefix << fmt.matSuffix; 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Derived::Nested m = _m; 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Derived::Scalar Scalar; 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Derived::Index Index; 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index width = 0; 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::streamsize explicit_precision; 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(fmt.precision == StreamPrecision) 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = 0; 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(fmt.precision == FullPrecision) 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (NumTraits<Scalar>::IsInteger) 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = 0; 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = significant_decimals_impl<Scalar>::run(); 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit_precision = fmt.precision; 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::streamsize old_precision = 0; 1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(explicit_precision) old_precision = s.precision(explicit_precision); 1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool align_cols = !(fmt.flags & DontAlignCols); 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(align_cols) 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // compute the largest width 1957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(Index j = 0; j < m.cols(); ++j) 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.rows(); ++i) 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::stringstream sstr; 1997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez sstr.copyfmt(s); 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sstr << m.coeff(i,j); 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath width = std::max<Index>(width, Index(sstr.str().length())); 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matPrefix; 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.rows(); ++i) 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (i) 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSpacer; 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowPrefix; 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(width) s.width(width); 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.coeff(i, 0); 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 1; j < m.cols(); ++j) 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.coeffSeparator; 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (width) s.width(width); 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.coeff(i, j); 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSuffix; 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if( i < m.rows() - 1) 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSeparator; 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matSuffix; 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(explicit_precision) s.precision(old_precision); 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \relates DenseBase 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outputs the matrix, to the given stream. 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If you wish to print the matrix with a format different than the default, use DenseBase::format(). 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers. 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters. 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format() 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::ostream & operator << 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath(std::ostream & s, 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DenseBase<Derived> & m) 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_IO_H 251