16 enum { DontAlignCols = 1 };
17 enum { StreamPrecision = -1,
21 template<
typename Derived>
22 std::ostream & print_matrix(std::ostream & s,
const Derived& _m,
const IOFormat& fmt);
53 IOFormat(
int _precision = StreamPrecision,
int _flags = 0,
54 const std::string& _coeffSeparator =
" ",
55 const std::string& _rowSeparator =
"\n",
const std::string& _rowPrefix=
"",
const std::string& _rowSuffix=
"",
56 const std::string& _matPrefix=
"",
const std::string& _matSuffix=
"")
57 : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator),
58 rowSpacer(
""), coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags)
60 int i = int(matSuffix.length())-1;
61 while (i>=0 && matSuffix[i]!=
'\n')
67 std::string matPrefix, matSuffix;
68 std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer;
69 std::string coeffSeparator;
89 template<
typename ExpressionType>
95 : m_matrix(matrix), m_format(format)
98 friend std::ostream & operator << (std::ostream & s,
const WithFormat& wf)
100 return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);
104 const typename ExpressionType::Nested m_matrix;
115 template<
typename Derived>
124 template<
typename Scalar,
bool IsInteger>
125 struct significant_decimals_default_impl
128 static inline int run()
136 template<
typename Scalar>
137 struct significant_decimals_default_impl<Scalar, true>
139 static inline int run()
145 template<
typename Scalar>
146 struct significant_decimals_impl
147 : significant_decimals_default_impl<Scalar, NumTraits<Scalar>::IsInteger>
152 template<
typename Derived>
153 std::ostream & print_matrix(std::ostream & s,
const Derived& _m,
const IOFormat& fmt)
157 s << fmt.matPrefix << fmt.matSuffix;
161 typename Derived::Nested m = _m;
162 typedef typename Derived::Scalar Scalar;
163 typedef typename Derived::Index Index;
167 std::streamsize explicit_precision;
168 if(fmt.precision == StreamPrecision)
170 explicit_precision = 0;
172 else if(fmt.precision == FullPrecision)
174 if (NumTraits<Scalar>::IsInteger)
176 explicit_precision = 0;
180 explicit_precision = significant_decimals_impl<Scalar>::run();
185 explicit_precision = fmt.precision;
188 std::streamsize old_precision = 0;
189 if(explicit_precision) old_precision = s.precision(explicit_precision);
191 bool align_cols = !(fmt.flags & DontAlignCols);
195 for(Index j = 0; j < m.cols(); ++j)
196 for(Index i = 0; i < m.rows(); ++i)
198 std::stringstream sstr;
200 sstr << m.coeff(i,j);
201 width = std::max<Index>(width, Index(sstr.str().length()));
205 for(Index i = 0; i < m.rows(); ++i)
210 if(width) s.width(width);
212 for(Index j = 1; j < m.cols(); ++j)
214 s << fmt.coeffSeparator;
215 if (width) s.width(width);
219 if( i < m.rows() - 1)
220 s << fmt.rowSeparator;
223 if(explicit_precision) s.precision(old_precision);
240 template<
typename Derived>
241 std::ostream &
operator <<
245 return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT);
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:88
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:41
const WithFormat< Derived > format(const IOFormat &fmt) const
Definition: IO.h:117