diff options
author | Gael Guennebaud <g.gael@free.fr> | 2008-08-21 13:17:21 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2008-08-21 13:17:21 +0000 |
commit | f729fc1d70e69d547bd5bd48678823dd9580bb7e (patch) | |
tree | 8bda3fea98536ed0a0ae7f8597eadd3c01175e3b /Eigen/src/Core/IO.h | |
parent | 591d497b848844dbae9ac3f38ad2d45241a05470 (diff) |
* Add the possibility to customize the output of matrices, e.g.:
IoFormat OctaveFmt(4, AlignCols, ", ", ";\n", "", "", "[", "]");
cout << mat.format(OctaveFmt);
The first "4" is the precision.
Documentation missing.
* Some compilation fixes
Diffstat (limited to 'Eigen/src/Core/IO.h')
-rw-r--r-- | Eigen/src/Core/IO.h | 87 |
1 files changed, 82 insertions, 5 deletions
diff --git a/Eigen/src/Core/IO.h b/Eigen/src/Core/IO.h index 705cc5605..5b503b590 100644 --- a/Eigen/src/Core/IO.h +++ b/Eigen/src/Core/IO.h @@ -25,19 +25,96 @@ #ifndef EIGEN_IO_H #define EIGEN_IO_H +enum { Raw, AlignCols }; + +struct IoFormat +{ + IoFormat(int _precision=4, int _flags=Raw, + const std::string& _coeffSeparator = " ", + const std::string& _rowSeparator = "\n", const std::string& _rowPrefix="", const std::string& _rowSuffix="", + const std::string& _matPrefix="", const std::string& _matSuffix="") + : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator), + coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags) + { + rowSpacer = ""; + int i=matSuffix.length()-1; + while (i>=0 && matSuffix[i]!='\n') + { + rowSpacer += ' '; + i--; + } + } + std::string matPrefix, matSuffix; + std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer; + std::string coeffSeparator; + int precision; + int flags; +}; + +template<typename ExpressionType> +class WithFormat +{ + public: + + WithFormat(const ExpressionType& matrix, const IoFormat& format) + : m_matrix(matrix), m_format(format) + {} + + friend std::ostream & operator << (std::ostream & s, const WithFormat& wf) + { + return ei_print_matrix(s, wf.m_matrix.eval(), wf.m_format); + } + + protected: + const typename ExpressionType::Nested m_matrix; + IoFormat m_format; +}; + template<typename Derived> -std::ostream & ei_print_matrix -(std::ostream & s, - const MatrixBase<Derived> & m) +inline const WithFormat<Derived> +MatrixBase<Derived>::format(const IoFormat& fmt) const { + return WithFormat<Derived>(derived(), fmt); +} + +template<typename Derived> +std::ostream & ei_print_matrix(std::ostream & s, const MatrixBase<Derived> & _m, + const IoFormat& fmt = IoFormat()) +{ + const typename Derived::Nested m = _m; + int width = 0; + if (fmt.flags & AlignCols) + { + // compute the largest width + for(int j = 1; j < m.cols(); j++) + for(int i = 0; i < m.rows(); i++) + { + std::stringstream sstr; + sstr.precision(fmt.precision); + sstr << m.coeff(i,j); + width = std::max<int>(width, sstr.str().length()); + } + } + s.precision(fmt.precision); + s << fmt.matPrefix; for(int i = 0; i < m.rows(); i++) { + if (i) + s << fmt.rowSpacer; + s << fmt.rowPrefix; + if(width) s.width(width); s << m.coeff(i, 0); for(int j = 1; j < m.cols(); j++) - s << " " << m.coeff(i, j); + { + s << fmt.coeffSeparator; + if (width) s.width(width); + s << m.coeff(i, j); + } + s << fmt.rowSuffix; if( i < m.rows() - 1) - s << "\n"; + s << fmt.rowSeparator; } + s << fmt.matSuffix; return s; } |