Mercurial > hg > octave-lyh
comparison src/ov-re-mat.cc @ 10315:57a59eae83cc
untabify src C++ source files
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 11 Feb 2010 12:41:46 -0500 |
parents | 3a8c13b71612 |
children | de2d43bcb083 |
comparison
equal
deleted
inserted
replaced
10314:07ebe522dac2 | 10315:57a59eae83cc |
---|---|
109 double retval = lo_ieee_nan_value (); | 109 double retval = lo_ieee_nan_value (); |
110 | 110 |
111 if (numel () > 0) | 111 if (numel () > 0) |
112 { | 112 { |
113 gripe_implicit_conversion ("Octave:array-as-scalar", | 113 gripe_implicit_conversion ("Octave:array-as-scalar", |
114 "real matrix", "real scalar"); | 114 "real matrix", "real scalar"); |
115 | 115 |
116 retval = matrix (0, 0); | 116 retval = matrix (0, 0); |
117 } | 117 } |
118 else | 118 else |
119 gripe_invalid_conversion ("real matrix", "real scalar"); | 119 gripe_invalid_conversion ("real matrix", "real scalar"); |
127 float retval = lo_ieee_float_nan_value (); | 127 float retval = lo_ieee_float_nan_value (); |
128 | 128 |
129 if (numel () > 0) | 129 if (numel () > 0) |
130 { | 130 { |
131 gripe_implicit_conversion ("Octave:array-as-scalar", | 131 gripe_implicit_conversion ("Octave:array-as-scalar", |
132 "real matrix", "real scalar"); | 132 "real matrix", "real scalar"); |
133 | 133 |
134 retval = matrix (0, 0); | 134 retval = matrix (0, 0); |
135 } | 135 } |
136 else | 136 else |
137 gripe_invalid_conversion ("real matrix", "real scalar"); | 137 gripe_invalid_conversion ("real matrix", "real scalar"); |
161 Complex retval (tmp, tmp); | 161 Complex retval (tmp, tmp); |
162 | 162 |
163 if (rows () > 0 && columns () > 0) | 163 if (rows () > 0 && columns () > 0) |
164 { | 164 { |
165 gripe_implicit_conversion ("Octave:array-as-scalar", | 165 gripe_implicit_conversion ("Octave:array-as-scalar", |
166 "real matrix", "complex scalar"); | 166 "real matrix", "complex scalar"); |
167 | 167 |
168 retval = matrix (0, 0); | 168 retval = matrix (0, 0); |
169 } | 169 } |
170 else | 170 else |
171 gripe_invalid_conversion ("real matrix", "complex scalar"); | 171 gripe_invalid_conversion ("real matrix", "complex scalar"); |
181 FloatComplex retval (tmp, tmp); | 181 FloatComplex retval (tmp, tmp); |
182 | 182 |
183 if (rows () > 0 && columns () > 0) | 183 if (rows () > 0 && columns () > 0) |
184 { | 184 { |
185 gripe_implicit_conversion ("Octave:array-as-scalar", | 185 gripe_implicit_conversion ("Octave:array-as-scalar", |
186 "real matrix", "complex scalar"); | 186 "real matrix", "complex scalar"); |
187 | 187 |
188 retval = matrix (0, 0); | 188 retval = matrix (0, 0); |
189 } | 189 } |
190 else | 190 else |
191 gripe_invalid_conversion ("real matrix", "complex scalar"); | 191 gripe_invalid_conversion ("real matrix", "complex scalar"); |
315 octave_quit (); | 315 octave_quit (); |
316 | 316 |
317 double d = matrix (i); | 317 double d = matrix (i); |
318 | 318 |
319 if (xisnan (d)) | 319 if (xisnan (d)) |
320 { | 320 { |
321 ::error ("invalid conversion from NaN to character"); | 321 ::error ("invalid conversion from NaN to character"); |
322 return retval; | 322 return retval; |
323 } | 323 } |
324 else | 324 else |
325 { | 325 { |
326 int ival = NINT (d); | 326 int ival = NINT (d); |
327 | 327 |
328 if (ival < 0 || ival > UCHAR_MAX) | 328 if (ival < 0 || ival > UCHAR_MAX) |
329 { | 329 { |
330 // FIXME -- is there something | 330 // FIXME -- is there something |
331 // better we could do? | 331 // better we could do? |
332 | 332 |
333 ival = 0; | 333 ival = 0; |
334 | 334 |
335 if (! warned) | 335 if (! warned) |
336 { | 336 { |
337 ::warning ("range error for conversion to character value"); | 337 ::warning ("range error for conversion to character value"); |
338 warned = true; | 338 warned = true; |
339 } | 339 } |
340 } | 340 } |
341 | 341 |
342 chm (i) = static_cast<char> (ival); | 342 chm (i) = static_cast<char> (ival); |
343 } | 343 } |
344 } | 344 } |
345 | 345 |
346 retval = octave_value (chm, type); | 346 retval = octave_value (chm, type); |
347 | 347 |
348 return retval; | 348 return retval; |
358 NDArray tmp = array_value (); | 358 NDArray tmp = array_value (); |
359 | 359 |
360 os << "# ndims: " << d.length () << "\n"; | 360 os << "# ndims: " << d.length () << "\n"; |
361 | 361 |
362 for (int i=0; i < d.length (); i++) | 362 for (int i=0; i < d.length (); i++) |
363 os << " " << d (i); | 363 os << " " << d (i); |
364 | 364 |
365 os << "\n" << tmp; | 365 os << "\n" << tmp; |
366 } | 366 } |
367 else | 367 else |
368 { | 368 { |
369 // Keep this case, rather than use generic code above for backward | 369 // Keep this case, rather than use generic code above for backward |
370 // compatiability. Makes load_ascii much more complex!! | 370 // compatiability. Makes load_ascii much more complex!! |
371 os << "# rows: " << rows () << "\n" | 371 os << "# rows: " << rows () << "\n" |
372 << "# columns: " << columns () << "\n"; | 372 << "# columns: " << columns () << "\n"; |
373 | 373 |
374 os << matrix_value (); | 374 os << matrix_value (); |
375 } | 375 } |
376 | 376 |
377 return true; | 377 return true; |
391 octave_idx_type val = 0; | 391 octave_idx_type val = 0; |
392 | 392 |
393 if (extract_keyword (is, keywords, kw, val, true)) | 393 if (extract_keyword (is, keywords, kw, val, true)) |
394 { | 394 { |
395 if (kw == "ndims") | 395 if (kw == "ndims") |
396 { | 396 { |
397 int mdims = static_cast<int> (val); | 397 int mdims = static_cast<int> (val); |
398 | 398 |
399 if (mdims >= 0) | 399 if (mdims >= 0) |
400 { | 400 { |
401 dim_vector dv; | 401 dim_vector dv; |
402 dv.resize (mdims); | 402 dv.resize (mdims); |
403 | 403 |
404 for (int i = 0; i < mdims; i++) | 404 for (int i = 0; i < mdims; i++) |
405 is >> dv(i); | 405 is >> dv(i); |
406 | 406 |
407 if (is) | 407 if (is) |
408 { | 408 { |
409 NDArray tmp(dv); | 409 NDArray tmp(dv); |
410 | 410 |
411 is >> tmp; | 411 is >> tmp; |
412 | 412 |
413 if (is) | 413 if (is) |
414 matrix = tmp; | 414 matrix = tmp; |
415 else | 415 else |
416 { | 416 { |
417 error ("load: failed to load matrix constant"); | 417 error ("load: failed to load matrix constant"); |
418 success = false; | 418 success = false; |
419 } | 419 } |
420 } | 420 } |
421 else | 421 else |
422 { | 422 { |
423 error ("load: failed to read dimensions"); | 423 error ("load: failed to read dimensions"); |
424 success = false; | 424 success = false; |
425 } | 425 } |
426 } | 426 } |
427 else | 427 else |
428 { | 428 { |
429 error ("load: failed to extract number of dimensions"); | 429 error ("load: failed to extract number of dimensions"); |
430 success = false; | 430 success = false; |
431 } | 431 } |
432 } | 432 } |
433 else if (kw == "rows") | 433 else if (kw == "rows") |
434 { | 434 { |
435 octave_idx_type nr = val; | 435 octave_idx_type nr = val; |
436 octave_idx_type nc = 0; | 436 octave_idx_type nc = 0; |
437 | 437 |
438 if (nr >= 0 && extract_keyword (is, "columns", nc) && nc >= 0) | 438 if (nr >= 0 && extract_keyword (is, "columns", nc) && nc >= 0) |
439 { | 439 { |
440 if (nr > 0 && nc > 0) | 440 if (nr > 0 && nc > 0) |
441 { | 441 { |
442 Matrix tmp (nr, nc); | 442 Matrix tmp (nr, nc); |
443 is >> tmp; | 443 is >> tmp; |
444 if (is) | 444 if (is) |
445 matrix = tmp; | 445 matrix = tmp; |
446 else | 446 else |
447 { | 447 { |
448 error ("load: failed to load matrix constant"); | 448 error ("load: failed to load matrix constant"); |
449 success = false; | 449 success = false; |
450 } | 450 } |
451 } | 451 } |
452 else if (nr == 0 || nc == 0) | 452 else if (nr == 0 || nc == 0) |
453 matrix = Matrix (nr, nc); | 453 matrix = Matrix (nr, nc); |
454 else | 454 else |
455 panic_impossible (); | 455 panic_impossible (); |
456 } | 456 } |
457 else | 457 else |
458 { | 458 { |
459 error ("load: failed to extract number of rows and columns"); | 459 error ("load: failed to extract number of rows and columns"); |
460 success = false; | 460 success = false; |
461 } | 461 } |
462 } | 462 } |
463 else | 463 else |
464 panic_impossible (); | 464 panic_impossible (); |
465 } | 465 } |
466 else | 466 else |
467 { | 467 { |
468 error ("load: failed to extract number of rows and columns"); | 468 error ("load: failed to extract number of rows and columns"); |
469 success = false; | 469 success = false; |
492 NDArray m = array_value (); | 492 NDArray m = array_value (); |
493 save_type st = LS_DOUBLE; | 493 save_type st = LS_DOUBLE; |
494 if (save_as_floats) | 494 if (save_as_floats) |
495 { | 495 { |
496 if (m.too_large_for_float ()) | 496 if (m.too_large_for_float ()) |
497 { | 497 { |
498 warning ("save: some values too large to save as floats --"); | 498 warning ("save: some values too large to save as floats --"); |
499 warning ("save: saving as doubles instead"); | 499 warning ("save: saving as doubles instead"); |
500 } | 500 } |
501 else | 501 else |
502 st = LS_FLOAT; | 502 st = LS_FLOAT; |
503 } | 503 } |
504 else if (d.numel () > 8192) // FIXME -- make this configurable. | 504 else if (d.numel () > 8192) // FIXME -- make this configurable. |
505 { | 505 { |
506 double max_val, min_val; | 506 double max_val, min_val; |
507 if (m.all_integers (max_val, min_val)) | 507 if (m.all_integers (max_val, min_val)) |
508 st = get_save_type (max_val, min_val); | 508 st = get_save_type (max_val, min_val); |
509 } | 509 } |
510 | 510 |
511 const double *mtmp = m.data (); | 511 const double *mtmp = m.data (); |
512 write_doubles (os, mtmp, st, d.numel ()); | 512 write_doubles (os, mtmp, st, d.numel ()); |
513 | 513 |
514 return true; | 514 return true; |
515 } | 515 } |
516 | 516 |
517 bool | 517 bool |
518 octave_matrix::load_binary (std::istream& is, bool swap, | 518 octave_matrix::load_binary (std::istream& is, bool swap, |
519 oct_mach_info::float_format fmt) | 519 oct_mach_info::float_format fmt) |
520 { | 520 { |
521 char tmp; | 521 char tmp; |
522 int32_t mdims; | 522 int32_t mdims; |
523 if (! is.read (reinterpret_cast<char *> (&mdims), 4)) | 523 if (! is.read (reinterpret_cast<char *> (&mdims), 4)) |
524 return false; | 524 return false; |
530 int32_t di; | 530 int32_t di; |
531 dim_vector dv; | 531 dim_vector dv; |
532 dv.resize (mdims); | 532 dv.resize (mdims); |
533 | 533 |
534 for (int i = 0; i < mdims; i++) | 534 for (int i = 0; i < mdims; i++) |
535 { | 535 { |
536 if (! is.read (reinterpret_cast<char *> (&di), 4)) | 536 if (! is.read (reinterpret_cast<char *> (&di), 4)) |
537 return false; | 537 return false; |
538 if (swap) | 538 if (swap) |
539 swap_bytes<4> (&di); | 539 swap_bytes<4> (&di); |
540 dv(i) = di; | 540 dv(i) = di; |
541 } | 541 } |
542 | 542 |
543 // Convert an array with a single dimension to be a row vector. | 543 // Convert an array with a single dimension to be a row vector. |
544 // Octave should never write files like this, other software | 544 // Octave should never write files like this, other software |
545 // might. | 545 // might. |
546 | 546 |
547 if (mdims == 1) | 547 if (mdims == 1) |
548 { | 548 { |
549 mdims = 2; | 549 mdims = 2; |
550 dv.resize (mdims); | 550 dv.resize (mdims); |
551 dv(1) = dv(0); | 551 dv(1) = dv(0); |
552 dv(0) = 1; | 552 dv(0) = 1; |
553 } | 553 } |
554 | 554 |
555 if (! is.read (reinterpret_cast<char *> (&tmp), 1)) | 555 if (! is.read (reinterpret_cast<char *> (&tmp), 1)) |
556 return false; | 556 return false; |
557 | 557 |
558 NDArray m(dv); | 558 NDArray m(dv); |
559 double *re = m.fortran_vec (); | 559 double *re = m.fortran_vec (); |
560 read_doubles (is, re, static_cast<save_type> (tmp), dv.numel (), swap, fmt); | 560 read_doubles (is, re, static_cast<save_type> (tmp), dv.numel (), swap, fmt); |
561 if (error_state || ! is) | 561 if (error_state || ! is) |
562 return false; | 562 return false; |
563 matrix = m; | 563 matrix = m; |
564 } | 564 } |
565 else | 565 else |
566 { | 566 { |
567 int32_t nr, nc; | 567 int32_t nr, nc; |
568 nr = mdims; | 568 nr = mdims; |
569 if (! is.read (reinterpret_cast<char *> (&nc), 4)) | 569 if (! is.read (reinterpret_cast<char *> (&nc), 4)) |
570 return false; | 570 return false; |
571 if (swap) | 571 if (swap) |
572 swap_bytes<4> (&nc); | 572 swap_bytes<4> (&nc); |
573 if (! is.read (reinterpret_cast<char *> (&tmp), 1)) | 573 if (! is.read (reinterpret_cast<char *> (&tmp), 1)) |
574 return false; | 574 return false; |
575 Matrix m (nr, nc); | 575 Matrix m (nr, nc); |
576 double *re = m.fortran_vec (); | 576 double *re = m.fortran_vec (); |
577 octave_idx_type len = nr * nc; | 577 octave_idx_type len = nr * nc; |
578 read_doubles (is, re, static_cast<save_type> (tmp), len, swap, fmt); | 578 read_doubles (is, re, static_cast<save_type> (tmp), len, swap, fmt); |
579 if (error_state || ! is) | 579 if (error_state || ! is) |
580 return false; | 580 return false; |
581 matrix = m; | 581 matrix = m; |
582 } | 582 } |
583 return true; | 583 return true; |
584 } | 584 } |
585 | 585 |
611 hid_t save_type_hid = H5T_NATIVE_DOUBLE; | 611 hid_t save_type_hid = H5T_NATIVE_DOUBLE; |
612 | 612 |
613 if (save_as_floats) | 613 if (save_as_floats) |
614 { | 614 { |
615 if (m.too_large_for_float ()) | 615 if (m.too_large_for_float ()) |
616 { | 616 { |
617 warning ("save: some values too large to save as floats --"); | 617 warning ("save: some values too large to save as floats --"); |
618 warning ("save: saving as doubles instead"); | 618 warning ("save: saving as doubles instead"); |
619 } | 619 } |
620 else | 620 else |
621 save_type_hid = H5T_NATIVE_FLOAT; | 621 save_type_hid = H5T_NATIVE_FLOAT; |
622 } | 622 } |
623 #if HAVE_HDF5_INT2FLOAT_CONVERSIONS | 623 #if HAVE_HDF5_INT2FLOAT_CONVERSIONS |
624 // hdf5 currently doesn't support float/integer conversions | 624 // hdf5 currently doesn't support float/integer conversions |
625 else | 625 else |
626 { | 626 { |
627 double max_val, min_val; | 627 double max_val, min_val; |
628 | 628 |
629 if (m.all_integers (max_val, min_val)) | 629 if (m.all_integers (max_val, min_val)) |
630 save_type_hid | 630 save_type_hid |
631 = save_type_to_hdf5 (get_save_type (max_val, min_val)); | 631 = save_type_to_hdf5 (get_save_type (max_val, min_val)); |
632 } | 632 } |
633 #endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */ | 633 #endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */ |
634 | 634 |
635 #if HAVE_HDF5_18 | 635 #if HAVE_HDF5_18 |
636 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid, | 636 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid, |
637 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); | 637 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); |
638 #else | 638 #else |
639 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid, | 639 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid, |
640 H5P_DEFAULT); | 640 H5P_DEFAULT); |
641 #endif | 641 #endif |
642 if (data_hid < 0) | 642 if (data_hid < 0) |
643 { | 643 { |
644 H5Sclose (space_hid); | 644 H5Sclose (space_hid); |
645 return false; | 645 return false; |
646 } | 646 } |
647 | 647 |
648 double *mtmp = m.fortran_vec (); | 648 double *mtmp = m.fortran_vec (); |
649 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, | 649 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, |
650 H5P_DEFAULT, mtmp) >= 0; | 650 H5P_DEFAULT, mtmp) >= 0; |
651 | 651 |
652 H5Dclose (data_hid); | 652 H5Dclose (data_hid); |
653 H5Sclose (space_hid); | 653 H5Sclose (space_hid); |
654 | 654 |
655 return retval; | 655 return retval; |
697 } | 697 } |
698 else | 698 else |
699 { | 699 { |
700 dv.resize (rank); | 700 dv.resize (rank); |
701 for (hsize_t i = 0, j = rank - 1; i < rank; i++, j--) | 701 for (hsize_t i = 0, j = rank - 1; i < rank; i++, j--) |
702 dv(j) = hdims[i]; | 702 dv(j) = hdims[i]; |
703 } | 703 } |
704 | 704 |
705 NDArray m (dv); | 705 NDArray m (dv); |
706 double *re = m.fortran_vec (); | 706 double *re = m.fortran_vec (); |
707 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, | 707 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, |
708 H5P_DEFAULT, re) >= 0) | 708 H5P_DEFAULT, re) >= 0) |
709 { | 709 { |
710 retval = true; | 710 retval = true; |
711 matrix = m; | 711 matrix = m; |
712 } | 712 } |
713 | 713 |
719 | 719 |
720 #endif | 720 #endif |
721 | 721 |
722 void | 722 void |
723 octave_matrix::print_raw (std::ostream& os, | 723 octave_matrix::print_raw (std::ostream& os, |
724 bool pr_as_read_syntax) const | 724 bool pr_as_read_syntax) const |
725 { | 725 { |
726 octave_print_internal (os, matrix, pr_as_read_syntax, | 726 octave_print_internal (os, matrix, pr_as_read_syntax, |
727 current_print_indent_level ()); | 727 current_print_indent_level ()); |
728 } | 728 } |
729 | 729 |
730 mxArray * | 730 mxArray * |
731 octave_matrix::as_mxArray (void) const | 731 octave_matrix::as_mxArray (void) const |
732 { | 732 { |
875 { | 875 { |
876 OCTAVE_TYPE_CONV_BODY3 (double, octave_perm_matrix, octave_scalar); | 876 OCTAVE_TYPE_CONV_BODY3 (double, octave_perm_matrix, octave_scalar); |
877 } | 877 } |
878 else if (args(0).is_diag_matrix ()) | 878 else if (args(0).is_diag_matrix ()) |
879 { | 879 { |
880 if (args(0).is_complex_type ()) | 880 if (args(0).is_complex_type ()) |
881 { | 881 { |
882 OCTAVE_TYPE_CONV_BODY3 (double, octave_complex_diag_matrix, octave_complex); | 882 OCTAVE_TYPE_CONV_BODY3 (double, octave_complex_diag_matrix, octave_complex); |
883 } | 883 } |
884 else | 884 else |
885 { | 885 { |
886 OCTAVE_TYPE_CONV_BODY3 (double, octave_diag_matrix, octave_scalar); | 886 OCTAVE_TYPE_CONV_BODY3 (double, octave_diag_matrix, octave_scalar); |
887 } | 887 } |
888 } | 888 } |
889 else if (args(0).is_sparse_type ()) | 889 else if (args(0).is_sparse_type ()) |
890 { | 890 { |
891 if (args(0).is_complex_type ()) | 891 if (args(0).is_complex_type ()) |
892 { | 892 { |
893 OCTAVE_TYPE_CONV_BODY3 (double, octave_sparse_complex_matrix, octave_complex); | 893 OCTAVE_TYPE_CONV_BODY3 (double, octave_sparse_complex_matrix, octave_complex); |
894 } | 894 } |
895 else | 895 else |
896 { | 896 { |
897 OCTAVE_TYPE_CONV_BODY3 (double, octave_sparse_matrix, octave_scalar); | 897 OCTAVE_TYPE_CONV_BODY3 (double, octave_sparse_matrix, octave_scalar); |
898 } | 898 } |
899 } | 899 } |
900 else if (args(0).is_complex_type ()) | 900 else if (args(0).is_complex_type ()) |
901 { | 901 { |
902 OCTAVE_TYPE_CONV_BODY3 (double, octave_complex_matrix, octave_complex); | 902 OCTAVE_TYPE_CONV_BODY3 (double, octave_complex_matrix, octave_complex); |
903 } | 903 } |
904 else | 904 else |
905 { | 905 { |
906 OCTAVE_TYPE_CONV_BODY3 (double, octave_matrix, octave_scalar); | 906 OCTAVE_TYPE_CONV_BODY3 (double, octave_matrix, octave_scalar); |
907 } | 907 } |
908 } | 908 } |
909 else | 909 else |
910 print_usage (); | 910 print_usage (); |
911 | 911 |
912 return octave_value (); | 912 return octave_value (); |