annotate armadillo-3.900.4/include/armadillo_bits/arma_ostream_meat.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
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 //! @}