function h5ex_t_regref %************************************************************************** % % This example shows how to read and write region references % to a dataset. The program first creates a dataset % containing characters and writes references to region of % the dataset to a new dataset with a dataspace of DIM0, % then closes the file. Next, it reopens the file, % dereferences the references, and outputs the referenced % regions to the screen. % % This file is intended for use with HDF5 Library version 1.8 %************************************************************************** FILE = 'h5ex_t_regref.h5'; DATASET = 'DS1'; DATASET2 = 'DS2'; DIM0 = 2; DS2DIM0 = 3; DS2DIM1 = 15; dims = DIM0; dims2 = [DS2DIM0, DS2DIM1]; wdata2= ['The quick brown';'fox jumps over ';'the 5 lazy dogs']; %This represents 4 points corresponding to the coordiantes point to the %characters 'h' 'd' 'f' and '5' in wdata2 Mcoords= [ 1 3 2 3 %row index 2 12 1 5]; %column index %This selects out 'The' and 'row' (in 'brown') from the first row. 'the' %and 'dog' from the third row. start = [1, 1]; %1-based index stride = [2, 11]; count = [2, 2]; block = [1, 3]; %To ensure that we interpret the referenced region correctly, we need to %save the expected dimensions too dimRef= [1 4 %for the first region i.e ['hdf5'] 2 6]; %for the second region i.e ['Therow'; 'thedog'] % %% Create a new file using the default properties. % file = H5F.create (FILE, 'H5F_ACC_TRUNC', 'H5P_DEFAULT', 'H5P_DEFAULT'); % % Create a dataset with character data. % %Write 'char' as uint8 data. space = H5S.create_simple (2, fliplr(dims2), []); dset2 = H5D.create (file, DATASET2, 'H5T_STD_I8LE',space, 'H5P_DEFAULT'); H5D.write (dset2, 'H5T_STD_I8LE', ... 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT',uint8(wdata2)); % % Create reference to a list of elements in dset2. HDF5 coordinates are % zero based, hence subtract 1 from the MATLAB coordinates. Due to the % orientation of coordinates, we use a FLIPUD instead of a FLIPLR to % account for the column-major (MATLAB) to row-major (C, HDF5 library) % conversion. % h5_coords=flipud(Mcoords-1); H5S.select_elements (space, 'H5S_SELECT_SET', h5_coords); wdata(:,1)=H5R.create ( file, DATASET2, 'H5R_DATASET_REGION', space); % % Create reference to a hyperslab in dset2, close dataspace. Convert from % 1-based colum major indexing to 0-based row major indexing % H5S.select_hyperslab (space, 'H5S_SELECT_SET', ... fliplr(start-1),... fliplr(stride),... fliplr(count),... fliplr(block)); wdata(:,2)=H5R.create (file, DATASET2, 'H5R_DATASET_REGION', space); H5S.close (space); % % Create dataspace. Setting maximum size to [] sets the maximum % size to be the current size. % space = H5S.create_simple (1, fliplr(dims), []); % % Create the dataset and write the region references to it. % dset = H5D.create (file, DATASET, 'H5T_STD_REF_DSETREG',... space, 'H5P_DEFAULT','H5P_DEFAULT', 'H5P_DEFAULT'); H5D.write (dset, 'H5T_STD_REF_DSETREG', ... 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT',wdata); %Attach the data dimensions of the referenced region to this dataset spaceatt = H5S.create_simple (2,fliplr( size(dimRef) ), []); attr = H5A.create (dset, 'dimRef', 'H5T_NATIVE_DOUBLE', ... spaceatt, 'H5P_DEFAULT'); H5A.write (attr, 'H5T_NATIVE_DOUBLE', dimRef); % % Close and release resources. % H5A.close(attr); H5S.close(spaceatt); H5D.close (dset); H5D.close (dset2); H5S.close (space); H5F.close (file); % %% Now we begin the read section of this example. % % % Open file and dataset. % file = H5F.open (FILE, 'H5F_ACC_RDONLY', 'H5P_DEFAULT'); dset = H5D.open (file, DATASET, 'H5P_DEFAULT'); % % Read the data. % rdata=H5D.read (dset, 'H5T_STD_REF_DSETREG', 'H5S_ALL',... 'H5S_ALL', 'H5P_DEFAULT'); % %Obtain the dimensions of the referenced region which we saved earlier an %attribute % attr = H5A.open_name (dset, 'dimRef'); dimRef=H5A.read (attr, 'H5T_NATIVE_INT'); H5A.close(attr); % % Output the data to the screen. % for i=1:dims fprintf(1,'%s[%d]:\n ->', DATASET, i); % % Open the referenced object, retrieve its region as a % dataspace selection. % dset2 = H5R.dereference (dset, 'H5R_DATASET_REGION', rdata(:,i)); space = H5R.get_region (dset, 'H5R_DATASET_REGION', rdata(:,i)); % % Get the name. % name = H5I.get_name (dset2); npoints = H5S.get_select_npoints (space); % % Read the dataset region % memspace = H5S.create_simple (1,npoints,[]); rdata2=H5D.read (dset2, 'H5ML_DEFAULT',... memspace, space, 'H5P_DEFAULT'); %Use the attribute value to reshape the referenced region rdata2=reshape(rdata2,dimRef(i,:)); % % Print the name and region data, close and release resources. % disp([name, ':']); disp(char( rdata2)); H5S.close (space); H5S.close (memspace); H5D.close (dset2); end % % Close and release resources. % H5D.close (dset); H5F.close (file);