Mercurial > octave-nkf
comparison src/ov-cell.cc @ 4814:495e9df75836
[project @ 2004-03-03 23:46:38 by jwe]
author | jwe |
---|---|
date | Wed, 03 Mar 2004 23:46:38 +0000 |
parents | 62f2fb593455 |
children | 2eb844b27953 |
comparison
equal
deleted
inserted
replaced
4813:fba5c6e96e0f | 4814:495e9df75836 |
---|---|
688 | 688 |
689 #if defined (HAVE_HDF5) | 689 #if defined (HAVE_HDF5) |
690 bool | 690 bool |
691 octave_cell::save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) | 691 octave_cell::save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) |
692 { | 692 { |
693 hsize_t dimens[3]; | 693 dim_vector dv = dims (); |
694 hsize_t rank = dv.length(); | |
694 hid_t space_hid = -1, data_hid = -1, size_hid = -1; | 695 hid_t space_hid = -1, data_hid = -1, size_hid = -1; |
695 | 696 |
696 data_hid = H5Gcreate (loc_id, name, 0); | 697 data_hid = H5Gcreate (loc_id, name, 0); |
697 if (data_hid < 0) return false; | 698 if (data_hid < 0) return false; |
698 | 699 |
699 // Have to save rows/columns since can't have a dataset of groups.... | 700 // Have to save cell array shape, since can't have a |
700 space_hid = H5Screate_simple (0, dimens, (hsize_t*) 0); | 701 // dataset of groups.... |
702 space_hid = H5Screate_simple (1, &rank, (hsize_t*) 0); | |
701 if (space_hid < 0) | 703 if (space_hid < 0) |
702 { | 704 { |
703 H5Gclose (data_hid); | 705 H5Gclose (data_hid); |
704 return false; | 706 return false; |
705 } | 707 } |
706 | 708 |
707 size_hid = H5Dcreate (data_hid, "rows", H5T_NATIVE_INT, space_hid, | 709 OCTAVE_LOCAL_BUFFER (int, hdims, rank); |
710 | |
711 // Octave uses column-major, while HDF5 uses row-major ordering | |
712 for (int i = 0; i < (int)rank; i++) | |
713 hdims[i] = dv (rank-i-1); | |
714 | |
715 size_hid = H5Dcreate (data_hid, "dims", H5T_NATIVE_INT, space_hid, | |
708 H5P_DEFAULT); | 716 H5P_DEFAULT); |
709 if (size_hid < 0) | 717 if (size_hid < 0) |
710 { | 718 { |
711 H5Sclose (space_hid); | 719 H5Sclose (space_hid); |
712 H5Gclose (data_hid); | 720 H5Gclose (data_hid); |
713 return false; | 721 return false; |
714 } | 722 } |
715 | 723 |
716 int rc = rows(); | |
717 if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, | 724 if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, |
718 H5P_DEFAULT, (void*) &rc) < 0) | 725 H5P_DEFAULT, (void*) hdims) < 0) |
719 { | 726 { |
720 H5Dclose (size_hid); | 727 H5Dclose (size_hid); |
721 H5Sclose (space_hid); | 728 H5Sclose (space_hid); |
722 H5Gclose (data_hid); | 729 H5Gclose (data_hid); |
723 return false; | 730 return false; |
724 } | 731 } |
725 H5Dclose (size_hid); | 732 H5Dclose (size_hid); |
726 | |
727 size_hid = H5Dcreate (data_hid, "columns", H5T_NATIVE_INT, space_hid, | |
728 H5P_DEFAULT); | |
729 if (size_hid < 0) | |
730 { | |
731 H5Sclose (space_hid); | |
732 H5Gclose (data_hid); | |
733 return false; | |
734 } | |
735 | |
736 rc = columns(); | |
737 if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, | |
738 H5P_DEFAULT, (void*) &rc) < 0) | |
739 { | |
740 H5Dclose (size_hid); | |
741 H5Sclose (space_hid); | |
742 H5Gclose (data_hid); | |
743 return false; | |
744 } | |
745 H5Dclose (size_hid); | |
746 H5Sclose (space_hid); | 733 H5Sclose (space_hid); |
747 | 734 |
748 // recursively add each element of the cell to this group | 735 // recursively add each element of the cell to this group |
749 Cell tmp = cell_value (); | 736 Cell tmp = cell_value (); |
750 | 737 |
751 for (int j = 0; j < tmp.cols (); j++) | 738 for (int i = 0; i < dv.numel (); i++) |
752 { | 739 { |
753 for (int i = 0; i < tmp.rows (); i++) | 740 char s[20]; |
754 { | 741 sprintf (s, "_%d", i); |
755 char s[20]; | 742 |
756 sprintf (s, "_%d", (i + j * tmp.rows ())); | 743 if (! add_hdf5_data(data_hid, tmp.elem (i), s, "", false, |
757 | 744 save_as_floats)) |
758 if (! add_hdf5_data(data_hid, tmp.elem (i, j), s, "", false, | 745 { |
759 save_as_floats)) | 746 H5Gclose (data_hid); |
760 { | 747 return false; |
761 H5Gclose (data_hid); | |
762 return false; | |
763 } | |
764 } | 748 } |
765 } | 749 } |
766 | 750 |
767 H5Gclose (data_hid); | 751 H5Gclose (data_hid); |
768 return true; | 752 return true; |
776 hid_t group_id = H5Gopen (loc_id, name); | 760 hid_t group_id = H5Gopen (loc_id, name); |
777 | 761 |
778 if (group_id < 0) | 762 if (group_id < 0) |
779 return false; | 763 return false; |
780 | 764 |
781 hid_t data_hid = H5Dopen (group_id, "rows"); | 765 hid_t data_hid = H5Dopen (group_id, "dims"); |
782 hid_t space_hid = H5Dget_space (data_hid); | 766 hid_t space_hid = H5Dget_space (data_hid); |
783 hsize_t rank = H5Sget_simple_extent_ndims (space_hid); | 767 hsize_t rank = H5Sget_simple_extent_ndims (space_hid); |
784 if (rank != 0) | 768 if (rank != 1) |
785 { | 769 { |
786 H5Dclose(data_hid); | 770 H5Dclose(data_hid); |
787 H5Gclose(group_id); | 771 H5Gclose(group_id); |
788 return false; | 772 return false; |
789 } | 773 } |
790 | 774 |
791 int nr; | 775 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); |
776 OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); | |
777 H5Sget_simple_extent_dims (space_hid, hdims, maxdims); | |
778 | |
779 // Octave uses column-major, while HDF5 uses row-major ordering | |
780 dim_vector dv; | |
781 dv.resize (hdims[0]); | |
782 OCTAVE_LOCAL_BUFFER (int, tmp, hdims[0]); | |
783 | |
792 if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, | 784 if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, |
793 H5P_DEFAULT, (void *) &nr) < 0) | 785 H5P_DEFAULT, (void *) tmp) < 0) |
794 { | 786 { |
795 H5Dclose(data_hid); | 787 H5Dclose(data_hid); |
796 H5Gclose(group_id); | 788 H5Gclose(group_id); |
797 return false; | 789 return false; |
798 } | 790 } |
799 H5Dclose (data_hid); | 791 H5Dclose (data_hid); |
800 | |
801 data_hid = H5Dopen (group_id, "columns"); | |
802 space_hid = H5Dget_space (data_hid); | |
803 rank = H5Sget_simple_extent_ndims (space_hid); | |
804 if (rank != 0) | |
805 { | |
806 H5Dclose(data_hid); | |
807 H5Gclose(group_id); | |
808 return false; | |
809 } | |
810 | |
811 int nc; | |
812 if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, | |
813 H5P_DEFAULT, (void *) &nc) < 0) | |
814 { | |
815 H5Dclose(data_hid); | |
816 H5Gclose(group_id); | |
817 return false; | |
818 } | |
819 H5Dclose (data_hid); | |
820 H5Gclose (group_id); | 792 H5Gclose (group_id); |
821 | 793 |
794 for (int i = 0, j = hdims[0] - 1; i < (int)hdims[0]; i++, j--) | |
795 dv(j) = tmp[i]; | |
796 | |
822 hdf5_callback_data dsub; | 797 hdf5_callback_data dsub; |
823 | 798 |
824 herr_t retval2 = -1; | 799 herr_t retval2 = -1; |
825 Cell m (nr, nc); | 800 Cell m (dv); |
826 int current_item = 0; | 801 int current_item = 0; |
827 if (have_h5giterate_bug) | 802 if (have_h5giterate_bug) |
828 current_item = 2; // Skip row/columns items in group | 803 current_item = 1; // Skip dims items in group |
829 | 804 |
830 #ifdef HAVE_H5GGET_NUM_OBJS | 805 #ifdef HAVE_H5GGET_NUM_OBJS |
831 hsize_t num_obj = 0; | 806 hsize_t num_obj = 0; |
832 H5Gget_num_objs (loc_id, &num_obj); | 807 H5Gget_num_objs (loc_id, &num_obj); |
833 #endif | 808 #endif |
834 | 809 |
835 for (int j = 0; j < nc; j++) | 810 for (int i = 0; i < dv.numel (); i++) |
836 { | 811 { |
837 for (int i = 0; i < nr; i++) | |
838 { | |
839 | 812 |
840 #ifdef HAVE_H5GGET_NUM_OBJS | 813 #ifdef HAVE_H5GGET_NUM_OBJS |
841 if (current_item >= static_cast<int> (num_obj)) | 814 if (current_item >= static_cast<int> (num_obj)) |
842 retval2 = -1; | 815 retval2 = -1; |
843 else | 816 else |
844 #endif | 817 #endif |
845 retval2 = H5Giterate (loc_id, name, ¤t_item, | 818 retval2 = H5Giterate (loc_id, name, ¤t_item, |
846 hdf5_read_next_data, &dsub); | 819 hdf5_read_next_data, &dsub); |
847 | 820 |
848 if (retval2 <= 0) | |
849 break; | |
850 | |
851 octave_value ov = dsub.tc; | |
852 m.elem (i, j) = ov; | |
853 | |
854 if (have_h5giterate_bug) | |
855 current_item++; // H5Giterate returned the last index processed | |
856 | |
857 } | |
858 if (retval2 <= 0) | 821 if (retval2 <= 0) |
859 break; | 822 break; |
823 | |
824 octave_value ov = dsub.tc; | |
825 m.elem (i) = ov; | |
826 | |
827 if (have_h5giterate_bug) | |
828 current_item++; // H5Giterate returned the last index processed | |
829 | |
860 } | 830 } |
861 | 831 |
862 if (retval2 >= 0) | 832 if (retval2 >= 0) |
863 { | 833 { |
864 matrix = m; | 834 matrix = m; |