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), 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags) 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath rowSpacer = ""; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int i = int(matSuffix.length())-1; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while (i>=0 && matSuffix[i]!='\n') 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath rowSpacer += ' '; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath i--; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string matPrefix, matSuffix; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string coeffSeparator; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int precision; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int flags; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class WithFormat 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Pseudo expression providing matrix output with given format 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param ExpressionType the type of the object on which IO stream operations are performed 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents an expression with stream operators controlled by a given IOFormat. 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is the return type of DenseBase::format() 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and most of the time this is the only way it is used. 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * See class IOFormat for some examples. 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format(), class IOFormat 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass WithFormat 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WithFormat(const ExpressionType& matrix, const IOFormat& format) 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_matrix(matrix), m_format(format) 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator << (std::ostream & s, const WithFormat& wf) 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format); 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename ExpressionType::Nested m_matrix; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IOFormat m_format; 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a WithFormat proxy object allowing to print a matrix the with given 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * format \a fmt. 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * See class IOFormat for some examples. 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class IOFormat, class WithFormat 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const WithFormat<Derived> 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::format(const IOFormat& fmt) const 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return WithFormat<Derived>(derived(), fmt); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, bool IsInteger> 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct significant_decimals_default_impl 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline int run() 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::ceil; 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 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool align_cols = !(fmt.flags & DontAlignCols); 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(align_cols) 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // compute the largest width 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 1; j < m.cols(); ++j) 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.rows(); ++i) 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::stringstream sstr; 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(explicit_precision) sstr.precision(explicit_precision); 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sstr << m.coeff(i,j); 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath width = std::max<Index>(width, Index(sstr.str().length())); 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::streamsize old_precision = 0; 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(explicit_precision) old_precision = s.precision(explicit_precision); 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matPrefix; 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.rows(); ++i) 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (i) 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSpacer; 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowPrefix; 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(width) s.width(width); 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.coeff(i, 0); 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 1; j < m.cols(); ++j) 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.coeffSeparator; 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (width) s.width(width); 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << m.coeff(i, j); 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSuffix; 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if( i < m.rows() - 1) 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.rowSeparator; 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << fmt.matSuffix; 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(explicit_precision) s.precision(old_precision); 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \relates DenseBase 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outputs the matrix, to the given stream. 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If you wish to print the matrix with a format different than the default, use DenseBase::format(). 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers. 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters. 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseBase::format() 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstd::ostream & operator << 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath(std::ostream & s, 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DenseBase<Derived> & m) 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT); 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_IO_H 250