aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/IO.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2008-08-21 13:17:21 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2008-08-21 13:17:21 +0000
commitf729fc1d70e69d547bd5bd48678823dd9580bb7e (patch)
tree8bda3fea98536ed0a0ae7f8597eadd3c01175e3b /Eigen/src/Core/IO.h
parent591d497b848844dbae9ac3f38ad2d45241a05470 (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.h87
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;
}