Chris@49
|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2012 Conrad Sanderson
|
Chris@49
|
3 // Copyright (C) 2012 Ryan Curtin
|
Chris@49
|
4 //
|
Chris@49
|
5 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
8
|
Chris@49
|
9
|
Chris@49
|
10 //! \addtogroup arma_ostream
|
Chris@49
|
11 //! @{
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14
|
Chris@49
|
15 inline
|
Chris@49
|
16 arma_ostream_state::arma_ostream_state(const std::ostream& o)
|
Chris@49
|
17 : orig_flags (o.flags())
|
Chris@49
|
18 , orig_precision(o.precision())
|
Chris@49
|
19 , orig_width (o.width())
|
Chris@49
|
20 , orig_fill (o.fill())
|
Chris@49
|
21 {
|
Chris@49
|
22 }
|
Chris@49
|
23
|
Chris@49
|
24
|
Chris@49
|
25
|
Chris@49
|
26 inline
|
Chris@49
|
27 void
|
Chris@49
|
28 arma_ostream_state::restore(std::ostream& o) const
|
Chris@49
|
29 {
|
Chris@49
|
30 o.flags (orig_flags);
|
Chris@49
|
31 o.precision(orig_precision);
|
Chris@49
|
32 o.width (orig_width);
|
Chris@49
|
33 o.fill (orig_fill);
|
Chris@49
|
34 }
|
Chris@49
|
35
|
Chris@49
|
36
|
Chris@49
|
37
|
Chris@49
|
38 //
|
Chris@49
|
39 //
|
Chris@49
|
40
|
Chris@49
|
41
|
Chris@49
|
42
|
Chris@49
|
43 template<typename eT>
|
Chris@49
|
44 inline
|
Chris@49
|
45 std::streamsize
|
Chris@49
|
46 arma_ostream::modify_stream(std::ostream& o, const eT* data, const uword n_elem)
|
Chris@49
|
47 {
|
Chris@49
|
48 o.unsetf(ios::showbase);
|
Chris@49
|
49 o.unsetf(ios::uppercase);
|
Chris@49
|
50 o.unsetf(ios::showpos);
|
Chris@49
|
51
|
Chris@49
|
52 o.fill(' ');
|
Chris@49
|
53
|
Chris@49
|
54 std::streamsize cell_width;
|
Chris@49
|
55
|
Chris@49
|
56 bool use_layout_B = false;
|
Chris@49
|
57 bool use_layout_C = false;
|
Chris@49
|
58
|
Chris@49
|
59 for(uword i=0; i<n_elem; ++i)
|
Chris@49
|
60 {
|
Chris@49
|
61 const eT val = data[i];
|
Chris@49
|
62
|
Chris@49
|
63 if(
|
Chris@49
|
64 ( val >= eT(+100) )
|
Chris@49
|
65 ||
|
Chris@49
|
66 //( (is_signed<eT>::value == true) && (val <= eT(-100)) ) ||
|
Chris@49
|
67 //( (is_non_integral<eT>::value == true) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||
|
Chris@49
|
68 //( (is_non_integral<eT>::value == true) && (is_signed<eT>::value == true) && (val < eT(0)) && (val >= eT(-1e-4)) )
|
Chris@49
|
69 (
|
Chris@49
|
70 cond_rel< is_signed<eT>::value >::leq(val, eT(-100))
|
Chris@49
|
71 )
|
Chris@49
|
72 ||
|
Chris@49
|
73 (
|
Chris@49
|
74 cond_rel< is_non_integral<eT>::value >::gt(val, eT(0))
|
Chris@49
|
75 &&
|
Chris@49
|
76 cond_rel< is_non_integral<eT>::value >::leq(val, eT(+1e-4))
|
Chris@49
|
77 )
|
Chris@49
|
78 ||
|
Chris@49
|
79 (
|
Chris@49
|
80 cond_rel< is_non_integral<eT>::value && is_signed<eT>::value >::lt(val, eT(0))
|
Chris@49
|
81 &&
|
Chris@49
|
82 cond_rel< is_non_integral<eT>::value && is_signed<eT>::value >::geq(val, eT(-1e-4))
|
Chris@49
|
83 )
|
Chris@49
|
84 )
|
Chris@49
|
85 {
|
Chris@49
|
86 use_layout_C = true;
|
Chris@49
|
87 break;
|
Chris@49
|
88 }
|
Chris@49
|
89
|
Chris@49
|
90 if(
|
Chris@49
|
91 // (val >= eT(+10)) || ( (is_signed<eT>::value == true) && (val <= eT(-10)) )
|
Chris@49
|
92 (val >= eT(+10)) || ( cond_rel< is_signed<eT>::value >::leq(val, eT(-10)) )
|
Chris@49
|
93 )
|
Chris@49
|
94 {
|
Chris@49
|
95 use_layout_B = true;
|
Chris@49
|
96 }
|
Chris@49
|
97 }
|
Chris@49
|
98
|
Chris@49
|
99 if(use_layout_C == true)
|
Chris@49
|
100 {
|
Chris@49
|
101 o.setf(ios::scientific);
|
Chris@49
|
102 o.setf(ios::right);
|
Chris@49
|
103 o.unsetf(ios::fixed);
|
Chris@49
|
104 o.precision(4);
|
Chris@49
|
105 cell_width = 13;
|
Chris@49
|
106 }
|
Chris@49
|
107 else
|
Chris@49
|
108 if(use_layout_B == true)
|
Chris@49
|
109 {
|
Chris@49
|
110 o.unsetf(ios::scientific);
|
Chris@49
|
111 o.setf(ios::right);
|
Chris@49
|
112 o.setf(ios::fixed);
|
Chris@49
|
113 o.precision(4);
|
Chris@49
|
114 cell_width = 10;
|
Chris@49
|
115 }
|
Chris@49
|
116 else
|
Chris@49
|
117 {
|
Chris@49
|
118 o.unsetf(ios::scientific);
|
Chris@49
|
119 o.setf(ios::right);
|
Chris@49
|
120 o.setf(ios::fixed);
|
Chris@49
|
121 o.precision(4);
|
Chris@49
|
122 cell_width = 9;
|
Chris@49
|
123 }
|
Chris@49
|
124
|
Chris@49
|
125 return cell_width;
|
Chris@49
|
126 }
|
Chris@49
|
127
|
Chris@49
|
128
|
Chris@49
|
129
|
Chris@49
|
130 //! "better than nothing" settings for complex numbers
|
Chris@49
|
131 template<typename T>
|
Chris@49
|
132 inline
|
Chris@49
|
133 std::streamsize
|
Chris@49
|
134 arma_ostream::modify_stream(std::ostream& o, const std::complex<T>* data, const uword n_elem)
|
Chris@49
|
135 {
|
Chris@49
|
136 arma_ignore(data);
|
Chris@49
|
137 arma_ignore(n_elem);
|
Chris@49
|
138
|
Chris@49
|
139 o.unsetf(ios::showbase);
|
Chris@49
|
140 o.unsetf(ios::uppercase);
|
Chris@49
|
141 o.fill(' ');
|
Chris@49
|
142
|
Chris@49
|
143 o.setf(ios::scientific);
|
Chris@49
|
144 o.setf(ios::showpos);
|
Chris@49
|
145 o.setf(ios::right);
|
Chris@49
|
146 o.unsetf(ios::fixed);
|
Chris@49
|
147
|
Chris@49
|
148 std::streamsize cell_width;
|
Chris@49
|
149
|
Chris@49
|
150 o.precision(3);
|
Chris@49
|
151 cell_width = 2 + 2*(1 + 3 + o.precision() + 5) + 1;
|
Chris@49
|
152
|
Chris@49
|
153 return cell_width;
|
Chris@49
|
154 }
|
Chris@49
|
155
|
Chris@49
|
156
|
Chris@49
|
157 template<typename eT>
|
Chris@49
|
158 inline
|
Chris@49
|
159 std::streamsize
|
Chris@49
|
160 arma_ostream::modify_stream(std::ostream& o, typename SpMat<eT>::const_iterator begin, const uword n_elem, const typename arma_not_cx<eT>::result* junk)
|
Chris@49
|
161 {
|
Chris@49
|
162 arma_extra_debug_sigprint();
|
Chris@49
|
163 arma_ignore(junk);
|
Chris@49
|
164
|
Chris@49
|
165 o.unsetf(ios::showbase);
|
Chris@49
|
166 o.unsetf(ios::uppercase);
|
Chris@49
|
167 o.unsetf(ios::showpos);
|
Chris@49
|
168
|
Chris@49
|
169 o.fill(' ');
|
Chris@49
|
170
|
Chris@49
|
171 std::streamsize cell_width;
|
Chris@49
|
172
|
Chris@49
|
173 bool use_layout_B = false;
|
Chris@49
|
174 bool use_layout_C = false;
|
Chris@49
|
175
|
Chris@49
|
176 for(typename SpMat<eT>::const_iterator it = begin; it.pos() < n_elem; ++it)
|
Chris@49
|
177 {
|
Chris@49
|
178 const eT val = *it;
|
Chris@49
|
179
|
Chris@49
|
180 if(
|
Chris@49
|
181 val >= eT(+100) ||
|
Chris@49
|
182 ( (is_signed<eT>::value == true) && (val <= eT(-100)) ) ||
|
Chris@49
|
183 ( (is_non_integral<eT>::value == true) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||
|
Chris@49
|
184 ( (is_non_integral<eT>::value == true) && (is_signed<eT>::value == true) && (val < eT(0)) && (val >= eT(-1e-4)) )
|
Chris@49
|
185 )
|
Chris@49
|
186 {
|
Chris@49
|
187 use_layout_C = true;
|
Chris@49
|
188 break;
|
Chris@49
|
189 }
|
Chris@49
|
190
|
Chris@49
|
191 if(
|
Chris@49
|
192 (val >= eT(+10)) || ( (is_signed<eT>::value == true) && (val <= eT(-10)) )
|
Chris@49
|
193 )
|
Chris@49
|
194 {
|
Chris@49
|
195 use_layout_B = true;
|
Chris@49
|
196 }
|
Chris@49
|
197 }
|
Chris@49
|
198
|
Chris@49
|
199 if(use_layout_C == true)
|
Chris@49
|
200 {
|
Chris@49
|
201 o.setf(ios::scientific);
|
Chris@49
|
202 o.setf(ios::right);
|
Chris@49
|
203 o.unsetf(ios::fixed);
|
Chris@49
|
204 o.precision(4);
|
Chris@49
|
205 cell_width = 13;
|
Chris@49
|
206 }
|
Chris@49
|
207 else
|
Chris@49
|
208 if(use_layout_B == true)
|
Chris@49
|
209 {
|
Chris@49
|
210 o.unsetf(ios::scientific);
|
Chris@49
|
211 o.setf(ios::right);
|
Chris@49
|
212 o.setf(ios::fixed);
|
Chris@49
|
213 o.precision(4);
|
Chris@49
|
214 cell_width = 10;
|
Chris@49
|
215 }
|
Chris@49
|
216 else
|
Chris@49
|
217 {
|
Chris@49
|
218 o.unsetf(ios::scientific);
|
Chris@49
|
219 o.setf(ios::right);
|
Chris@49
|
220 o.setf(ios::fixed);
|
Chris@49
|
221 o.precision(4);
|
Chris@49
|
222 cell_width = 9;
|
Chris@49
|
223 }
|
Chris@49
|
224
|
Chris@49
|
225 return cell_width;
|
Chris@49
|
226 }
|
Chris@49
|
227
|
Chris@49
|
228
|
Chris@49
|
229
|
Chris@49
|
230 //! "better than nothing" settings for complex numbers
|
Chris@49
|
231 template<typename T>
|
Chris@49
|
232 inline
|
Chris@49
|
233 std::streamsize
|
Chris@49
|
234 arma_ostream::modify_stream(std::ostream& o, typename SpMat<T>::const_iterator begin, const uword n_elem, const typename arma_cx_only<T>::result* junk)
|
Chris@49
|
235 {
|
Chris@49
|
236 arma_ignore(begin);
|
Chris@49
|
237 arma_ignore(n_elem);
|
Chris@49
|
238 arma_ignore(junk);
|
Chris@49
|
239
|
Chris@49
|
240 o.unsetf(ios::showbase);
|
Chris@49
|
241 o.unsetf(ios::uppercase);
|
Chris@49
|
242 o.fill(' ');
|
Chris@49
|
243
|
Chris@49
|
244 o.setf(ios::scientific);
|
Chris@49
|
245 o.setf(ios::showpos);
|
Chris@49
|
246 o.setf(ios::right);
|
Chris@49
|
247 o.unsetf(ios::fixed);
|
Chris@49
|
248
|
Chris@49
|
249 std::streamsize cell_width;
|
Chris@49
|
250
|
Chris@49
|
251 o.precision(3);
|
Chris@49
|
252 cell_width = 2 + 2*(1 + 3 + o.precision() + 5) + 1;
|
Chris@49
|
253
|
Chris@49
|
254 return cell_width;
|
Chris@49
|
255 }
|
Chris@49
|
256
|
Chris@49
|
257
|
Chris@49
|
258
|
Chris@49
|
259 template<typename eT>
|
Chris@49
|
260 inline
|
Chris@49
|
261 void
|
Chris@49
|
262 arma_ostream::print_elem_zero(std::ostream& o, const bool modify)
|
Chris@49
|
263 {
|
Chris@49
|
264 if(modify == true)
|
Chris@49
|
265 {
|
Chris@49
|
266 const std::streamsize orig_precision = o.precision();
|
Chris@49
|
267
|
Chris@49
|
268 o.precision(0);
|
Chris@49
|
269
|
Chris@49
|
270 o << eT(0);
|
Chris@49
|
271
|
Chris@49
|
272 o.precision(orig_precision);
|
Chris@49
|
273 }
|
Chris@49
|
274 else
|
Chris@49
|
275 {
|
Chris@49
|
276 o << eT(0);
|
Chris@49
|
277 }
|
Chris@49
|
278 }
|
Chris@49
|
279
|
Chris@49
|
280
|
Chris@49
|
281
|
Chris@49
|
282 //! Print an element to the specified stream
|
Chris@49
|
283 template<typename eT>
|
Chris@49
|
284 arma_inline
|
Chris@49
|
285 void
|
Chris@49
|
286 arma_ostream::print_elem(std::ostream& o, const eT& x, const bool modify)
|
Chris@49
|
287 {
|
Chris@49
|
288 if(x != eT(0))
|
Chris@49
|
289 {
|
Chris@49
|
290 o << x;
|
Chris@49
|
291 }
|
Chris@49
|
292 else
|
Chris@49
|
293 {
|
Chris@49
|
294 arma_ostream::print_elem_zero<eT>(o, modify);
|
Chris@49
|
295 }
|
Chris@49
|
296 }
|
Chris@49
|
297
|
Chris@49
|
298
|
Chris@49
|
299
|
Chris@49
|
300 //! Print a complex element to the specified stream
|
Chris@49
|
301 template<typename T>
|
Chris@49
|
302 inline
|
Chris@49
|
303 void
|
Chris@49
|
304 arma_ostream::print_elem(std::ostream& o, const std::complex<T>& x, const bool modify)
|
Chris@49
|
305 {
|
Chris@49
|
306 if( (x.real() != T(0)) || (x.imag() != T(0)) || (modify == false) )
|
Chris@49
|
307 {
|
Chris@49
|
308 std::ostringstream ss;
|
Chris@49
|
309 ss.flags(o.flags());
|
Chris@49
|
310 //ss.imbue(o.getloc());
|
Chris@49
|
311 ss.precision(o.precision());
|
Chris@49
|
312
|
Chris@49
|
313 ss << '(' << x.real() << ',' << x.imag() << ')';
|
Chris@49
|
314 o << ss.str();
|
Chris@49
|
315 }
|
Chris@49
|
316 else
|
Chris@49
|
317 {
|
Chris@49
|
318 o << "(0,0)";
|
Chris@49
|
319 }
|
Chris@49
|
320 }
|
Chris@49
|
321
|
Chris@49
|
322
|
Chris@49
|
323
|
Chris@49
|
324 //! Print a matrix to the specified stream
|
Chris@49
|
325 template<typename eT>
|
Chris@49
|
326 inline
|
Chris@49
|
327 void
|
Chris@49
|
328 arma_ostream::print(std::ostream& o, const Mat<eT>& m, const bool modify)
|
Chris@49
|
329 {
|
Chris@49
|
330 arma_extra_debug_sigprint();
|
Chris@49
|
331
|
Chris@49
|
332 const arma_ostream_state stream_state(o);
|
Chris@49
|
333
|
Chris@49
|
334 const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, m.memptr(), m.n_elem) : o.width();
|
Chris@49
|
335
|
Chris@49
|
336 const uword m_n_rows = m.n_rows;
|
Chris@49
|
337 const uword m_n_cols = m.n_cols;
|
Chris@49
|
338
|
Chris@49
|
339 if(m.is_empty() == false)
|
Chris@49
|
340 {
|
Chris@49
|
341 if(m_n_cols > 0)
|
Chris@49
|
342 {
|
Chris@49
|
343 if(cell_width > 0)
|
Chris@49
|
344 {
|
Chris@49
|
345 for(uword row=0; row < m_n_rows; ++row)
|
Chris@49
|
346 {
|
Chris@49
|
347 for(uword col=0; col < m_n_cols; ++col)
|
Chris@49
|
348 {
|
Chris@49
|
349 // the cell width appears to be reset after each element is printed,
|
Chris@49
|
350 // hence we need to restore it
|
Chris@49
|
351 o.width(cell_width);
|
Chris@49
|
352 arma_ostream::print_elem(o, m.at(row,col), modify);
|
Chris@49
|
353 }
|
Chris@49
|
354
|
Chris@49
|
355 o << '\n';
|
Chris@49
|
356 }
|
Chris@49
|
357 }
|
Chris@49
|
358 else
|
Chris@49
|
359 {
|
Chris@49
|
360 for(uword row=0; row < m_n_rows; ++row)
|
Chris@49
|
361 {
|
Chris@49
|
362 for(uword col=0; col < m_n_cols-1; ++col)
|
Chris@49
|
363 {
|
Chris@49
|
364 arma_ostream::print_elem(o, m.at(row,col), modify);
|
Chris@49
|
365 o << ' ';
|
Chris@49
|
366 }
|
Chris@49
|
367
|
Chris@49
|
368 arma_ostream::print_elem(o, m.at(row, m_n_cols-1), modify);
|
Chris@49
|
369 o << '\n';
|
Chris@49
|
370 }
|
Chris@49
|
371 }
|
Chris@49
|
372 }
|
Chris@49
|
373 }
|
Chris@49
|
374 else
|
Chris@49
|
375 {
|
Chris@49
|
376 o << "[matrix size: " << m_n_rows << 'x' << m_n_cols << "]\n";
|
Chris@49
|
377 }
|
Chris@49
|
378
|
Chris@49
|
379 o.flush();
|
Chris@49
|
380 stream_state.restore(o);
|
Chris@49
|
381 }
|
Chris@49
|
382
|
Chris@49
|
383
|
Chris@49
|
384
|
Chris@49
|
385 //! Print a cube to the specified stream
|
Chris@49
|
386 template<typename eT>
|
Chris@49
|
387 inline
|
Chris@49
|
388 void
|
Chris@49
|
389 arma_ostream::print(std::ostream& o, const Cube<eT>& x, const bool modify)
|
Chris@49
|
390 {
|
Chris@49
|
391 arma_extra_debug_sigprint();
|
Chris@49
|
392
|
Chris@49
|
393 const arma_ostream_state stream_state(o);
|
Chris@49
|
394
|
Chris@49
|
395 const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, x.memptr(), x.n_elem) : o.width();
|
Chris@49
|
396
|
Chris@49
|
397 if(x.is_empty() == false)
|
Chris@49
|
398 {
|
Chris@49
|
399 for(uword slice=0; slice < x.n_slices; ++slice)
|
Chris@49
|
400 {
|
Chris@49
|
401 o << "[cube slice " << slice << ']' << '\n';
|
Chris@49
|
402 o.width(cell_width);
|
Chris@49
|
403 arma_ostream::print(o, x.slice(slice), false);
|
Chris@49
|
404 o << '\n';
|
Chris@49
|
405 }
|
Chris@49
|
406 }
|
Chris@49
|
407 else
|
Chris@49
|
408 {
|
Chris@49
|
409 o << "[cube size: " << x.n_rows << 'x' << x.n_cols << 'x' << x.n_slices << "]\n";
|
Chris@49
|
410 }
|
Chris@49
|
411
|
Chris@49
|
412 stream_state.restore(o);
|
Chris@49
|
413 }
|
Chris@49
|
414
|
Chris@49
|
415
|
Chris@49
|
416
|
Chris@49
|
417
|
Chris@49
|
418 //! Print a field to the specified stream
|
Chris@49
|
419 //! Assumes type oT can be printed, i.e. oT has std::ostream& operator<< (std::ostream&, const oT&)
|
Chris@49
|
420 template<typename oT>
|
Chris@49
|
421 inline
|
Chris@49
|
422 void
|
Chris@49
|
423 arma_ostream::print(std::ostream& o, const field<oT>& x)
|
Chris@49
|
424 {
|
Chris@49
|
425 arma_extra_debug_sigprint();
|
Chris@49
|
426
|
Chris@49
|
427 const arma_ostream_state stream_state(o);
|
Chris@49
|
428
|
Chris@49
|
429 const std::streamsize cell_width = o.width();
|
Chris@49
|
430
|
Chris@49
|
431 const uword x_n_rows = x.n_rows;
|
Chris@49
|
432 const uword x_n_cols = x.n_cols;
|
Chris@49
|
433
|
Chris@49
|
434 if(x.is_empty() == false)
|
Chris@49
|
435 {
|
Chris@49
|
436 for(uword col=0; col<x_n_cols; ++col)
|
Chris@49
|
437 {
|
Chris@49
|
438 o << "[field column " << col << ']' << '\n';
|
Chris@49
|
439
|
Chris@49
|
440 for(uword row=0; row<x_n_rows; ++row)
|
Chris@49
|
441 {
|
Chris@49
|
442 o.width(cell_width);
|
Chris@49
|
443 o << x.at(row,col) << '\n';
|
Chris@49
|
444 }
|
Chris@49
|
445
|
Chris@49
|
446 o << '\n';
|
Chris@49
|
447 }
|
Chris@49
|
448 }
|
Chris@49
|
449 else
|
Chris@49
|
450 {
|
Chris@49
|
451 o << "[field size: " << x_n_rows << 'x' << x_n_cols << "]\n";
|
Chris@49
|
452 }
|
Chris@49
|
453
|
Chris@49
|
454 o.flush();
|
Chris@49
|
455 stream_state.restore(o);
|
Chris@49
|
456 }
|
Chris@49
|
457
|
Chris@49
|
458
|
Chris@49
|
459
|
Chris@49
|
460 //! Print a subfield to the specified stream
|
Chris@49
|
461 //! Assumes type oT can be printed, i.e. oT has std::ostream& operator<< (std::ostream&, const oT&)
|
Chris@49
|
462 template<typename oT>
|
Chris@49
|
463 inline
|
Chris@49
|
464 void
|
Chris@49
|
465 arma_ostream::print(std::ostream& o, const subview_field<oT>& x)
|
Chris@49
|
466 {
|
Chris@49
|
467 arma_extra_debug_sigprint();
|
Chris@49
|
468
|
Chris@49
|
469 const arma_ostream_state stream_state(o);
|
Chris@49
|
470
|
Chris@49
|
471 const std::streamsize cell_width = o.width();
|
Chris@49
|
472
|
Chris@49
|
473 const uword x_n_rows = x.n_rows;
|
Chris@49
|
474 const uword x_n_cols = x.n_cols;
|
Chris@49
|
475
|
Chris@49
|
476 for(uword col=0; col<x_n_cols; ++col)
|
Chris@49
|
477 {
|
Chris@49
|
478 o << "[field column " << col << ']' << '\n';
|
Chris@49
|
479 for(uword row=0; row<x_n_rows; ++row)
|
Chris@49
|
480 {
|
Chris@49
|
481 o.width(cell_width);
|
Chris@49
|
482 o << x.at(row,col) << '\n';
|
Chris@49
|
483 }
|
Chris@49
|
484
|
Chris@49
|
485 o << '\n';
|
Chris@49
|
486 }
|
Chris@49
|
487
|
Chris@49
|
488 o.flush();
|
Chris@49
|
489 stream_state.restore(o);
|
Chris@49
|
490 }
|
Chris@49
|
491
|
Chris@49
|
492
|
Chris@49
|
493
|
Chris@49
|
494 template<typename eT>
|
Chris@49
|
495 inline
|
Chris@49
|
496 void
|
Chris@49
|
497 arma_ostream::print_dense(std::ostream& o, const SpMat<eT>& m, const bool modify)
|
Chris@49
|
498 {
|
Chris@49
|
499 arma_extra_debug_sigprint();
|
Chris@49
|
500
|
Chris@49
|
501 const arma_ostream_state stream_state(o);
|
Chris@49
|
502
|
Chris@49
|
503 const uword m_n_rows = m.n_rows;
|
Chris@49
|
504 const uword m_n_cols = m.n_cols;
|
Chris@49
|
505
|
Chris@49
|
506 if(m.n_nonzero > 0)
|
Chris@49
|
507 {
|
Chris@49
|
508 const std::streamsize cell_width = modify ? modify_stream<eT>(o, m.begin(), m.n_nonzero) : o.width();
|
Chris@49
|
509
|
Chris@49
|
510 typename SpMat<eT>::const_iterator begin = m.begin();
|
Chris@49
|
511
|
Chris@49
|
512 if(m_n_cols > 0)
|
Chris@49
|
513 {
|
Chris@49
|
514 if(cell_width > 0)
|
Chris@49
|
515 {
|
Chris@49
|
516 // An efficient row_iterator would make this simpler and faster
|
Chris@49
|
517 for(uword row=0; row < m_n_rows; ++row)
|
Chris@49
|
518 {
|
Chris@49
|
519 for(uword col=0; col < m_n_cols; ++col)
|
Chris@49
|
520 {
|
Chris@49
|
521 // the cell width appears to be reset after each element is printed,
|
Chris@49
|
522 // hence we need to restore it
|
Chris@49
|
523 o.width(cell_width);
|
Chris@49
|
524 eT val = eT(0);
|
Chris@49
|
525 for(typename SpMat<eT>::const_iterator it = begin; it.pos() < m.n_nonzero; ++it)
|
Chris@49
|
526 {
|
Chris@49
|
527 if(it.row() == row && it.col() == col)
|
Chris@49
|
528 {
|
Chris@49
|
529 val = *it;
|
Chris@49
|
530 break;
|
Chris@49
|
531 }
|
Chris@49
|
532 }
|
Chris@49
|
533 arma_ostream::print_elem(o,eT(val), modify);
|
Chris@49
|
534 }
|
Chris@49
|
535
|
Chris@49
|
536 o << '\n';
|
Chris@49
|
537 }
|
Chris@49
|
538 }
|
Chris@49
|
539 else
|
Chris@49
|
540 {
|
Chris@49
|
541 // An efficient row_iterator would make this simpler and faster
|
Chris@49
|
542 for(uword row=0; row < m_n_rows; ++row)
|
Chris@49
|
543 {
|
Chris@49
|
544 for(uword col=0; col < m_n_cols; ++col)
|
Chris@49
|
545 {
|
Chris@49
|
546 eT val = eT(0);
|
Chris@49
|
547 for(typename SpMat<eT>::const_iterator it = begin; it.pos() < m.n_nonzero; ++it)
|
Chris@49
|
548 {
|
Chris@49
|
549 if(it.row() == row && it.col() == col)
|
Chris@49
|
550 {
|
Chris@49
|
551 val = *it;
|
Chris@49
|
552 break;
|
Chris@49
|
553 }
|
Chris@49
|
554 }
|
Chris@49
|
555 arma_ostream::print_elem(o,eT(val), modify);
|
Chris@49
|
556 o << ' ';
|
Chris@49
|
557 }
|
Chris@49
|
558
|
Chris@49
|
559 o << '\n';
|
Chris@49
|
560 }
|
Chris@49
|
561 }
|
Chris@49
|
562 }
|
Chris@49
|
563 }
|
Chris@49
|
564 else
|
Chris@49
|
565 {
|
Chris@49
|
566 if(m.n_elem == 0)
|
Chris@49
|
567 {
|
Chris@49
|
568 o << "[matrix size: " << m_n_rows << 'x' << m_n_cols << "]\n";
|
Chris@49
|
569 }
|
Chris@49
|
570 else
|
Chris@49
|
571 {
|
Chris@49
|
572 eT tmp[1];
|
Chris@49
|
573 tmp[0] = eT(0);
|
Chris@49
|
574
|
Chris@49
|
575 const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, &tmp[0], 1) : o.width();
|
Chris@49
|
576
|
Chris@49
|
577 for(uword row=0; row < m_n_rows; ++row)
|
Chris@49
|
578 {
|
Chris@49
|
579 for(uword col=0; col < m_n_cols; ++col)
|
Chris@49
|
580 {
|
Chris@49
|
581 o.width(cell_width);
|
Chris@49
|
582
|
Chris@49
|
583 arma_ostream::print_elem_zero<eT>(o, modify);
|
Chris@49
|
584
|
Chris@49
|
585 o << ' ';
|
Chris@49
|
586 }
|
Chris@49
|
587
|
Chris@49
|
588 o << '\n';
|
Chris@49
|
589 }
|
Chris@49
|
590 }
|
Chris@49
|
591 }
|
Chris@49
|
592
|
Chris@49
|
593 o.flush();
|
Chris@49
|
594 stream_state.restore(o);
|
Chris@49
|
595 }
|
Chris@49
|
596
|
Chris@49
|
597
|
Chris@49
|
598
|
Chris@49
|
599 template<typename eT>
|
Chris@49
|
600 inline
|
Chris@49
|
601 void
|
Chris@49
|
602 arma_ostream::print(std::ostream& o, const SpMat<eT>& m, const bool modify)
|
Chris@49
|
603 {
|
Chris@49
|
604 arma_extra_debug_sigprint();
|
Chris@49
|
605
|
Chris@49
|
606 const arma_ostream_state stream_state(o);
|
Chris@49
|
607
|
Chris@49
|
608 o.unsetf(ios::showbase);
|
Chris@49
|
609 o.unsetf(ios::uppercase);
|
Chris@49
|
610 o.unsetf(ios::showpos);
|
Chris@49
|
611 o.unsetf(ios::scientific);
|
Chris@49
|
612 o.setf(ios::right);
|
Chris@49
|
613 o.setf(ios::fixed);
|
Chris@49
|
614 o.precision(2);
|
Chris@49
|
615
|
Chris@49
|
616 const uword m_n_nonzero = m.n_nonzero;
|
Chris@49
|
617
|
Chris@49
|
618 o << "[matrix size: " << m.n_rows << 'x' << m.n_cols << "; n_nonzero: " << m_n_nonzero
|
Chris@49
|
619 << "; density: " << ((m.n_elem > 0) ? (double(m_n_nonzero) / double(m.n_elem) * double(100)) : double(0))
|
Chris@49
|
620 << "%]\n\n";
|
Chris@49
|
621
|
Chris@49
|
622 if(modify == false) { stream_state.restore(o); }
|
Chris@49
|
623
|
Chris@49
|
624 if(m_n_nonzero > 0)
|
Chris@49
|
625 {
|
Chris@49
|
626 const std::streamsize cell_width = modify ? modify_stream<eT>(o, m.begin(), m_n_nonzero) : o.width();
|
Chris@49
|
627
|
Chris@49
|
628 typename SpMat<eT>::const_iterator begin = m.begin();
|
Chris@49
|
629
|
Chris@49
|
630 while(begin != m.end())
|
Chris@49
|
631 {
|
Chris@49
|
632 const uword row = begin.row();
|
Chris@49
|
633
|
Chris@49
|
634 // TODO: change the maximum number of spaces before and after each location to be dependent on n_rows and n_cols
|
Chris@49
|
635
|
Chris@49
|
636 if(row < 10) { o << " "; }
|
Chris@49
|
637 else if(row < 100) { o << " "; }
|
Chris@49
|
638 else if(row < 1000) { o << " "; }
|
Chris@49
|
639 else if(row < 10000) { o << " "; }
|
Chris@49
|
640 else if(row < 100000) { o << ' '; }
|
Chris@49
|
641
|
Chris@49
|
642 const uword col = begin.col();
|
Chris@49
|
643
|
Chris@49
|
644 o << '(' << row << ", " << col << ") ";
|
Chris@49
|
645
|
Chris@49
|
646 if(col < 10) { o << " "; }
|
Chris@49
|
647 else if(col < 100) { o << " "; }
|
Chris@49
|
648 else if(col < 1000) { o << " "; }
|
Chris@49
|
649 else if(col < 10000) { o << " "; }
|
Chris@49
|
650 else if(col < 100000) { o << ' '; }
|
Chris@49
|
651
|
Chris@49
|
652 if(cell_width > 0) { o.width(cell_width); }
|
Chris@49
|
653
|
Chris@49
|
654 arma_ostream::print_elem(o, eT(*begin), modify);
|
Chris@49
|
655 o << '\n';
|
Chris@49
|
656
|
Chris@49
|
657 ++begin;
|
Chris@49
|
658 }
|
Chris@49
|
659
|
Chris@49
|
660 o << '\n';
|
Chris@49
|
661 }
|
Chris@49
|
662
|
Chris@49
|
663 o.flush();
|
Chris@49
|
664 stream_state.restore(o);
|
Chris@49
|
665 }
|
Chris@49
|
666
|
Chris@49
|
667
|
Chris@49
|
668
|
Chris@49
|
669 //! @}
|