Dear all,

I am sorry if I am posing a stupid question, but it seems I cannot really see how I can solve this on my own.

The problem is understanding HDF5's possibility of creating datasets with slabs. For instance, write a 5x2 matrix with only one row set to { 42, 42 }.

As far as I've learned reading the docs, I create the file, the dataspace with properties (5x2 of integers, for instance), and finally the dataspace itself. Then I can select the hyperslab and write to it.

What I'm getting is junk. I suspect I'm writing what I'm not supposed to write, or reading where I've not intended to read, or both. Here's the dump:

HDF5 "test.h5" {
GROUP "/" {
   DATASET "dset" {
      DATATYPE  H5T_STD_I32BE
      DATASPACE  SIMPLE { ( 5, 2 ) / ( 5, 2 ) }
      DATA {
      (0,0): 704643072, 704643072,
      (1,0): 0, 0,
      (2,0): 16777216, 0,
      (3,0): 16777216, 0,
      (4,0): 16777216, 0
      }
   }
}
}


I've played with my values, with count, offset and block, but I cannot grasp how it works.

The code is below, it is commented with what I think each instruction does, and what each variable means.


I really hope you can help me.

Thank you!



#include "hdf5.h"

int main()
{
  hid_t       file_id, dataspace_id, dataset_id;
  herr_t      status;
  int         rank = 2;            /* rank 2 tensor */
  hsize_t     dims[2] = { 5, 2 };  /* 5 rows, 2 columns */

  hsize_t     offset[2], stride[2], count[2], block[2];

  int         newdata[3] = { 42, 42 };

  /* create file */
  file_id = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

  /* create dataspace */
  dataspace_id = H5Screate_simple(rank, dims, NULL);

  /* create dataset: the ACTUAL data */
  dataset_id = H5Dcreate(file_id, "/dset", H5T_STD_I32BE, dataspace_id,
                         H5P_DEFAULT);

  /* slab properties */
  offset[0] = 1; /* row offset, select second row */
  offset[1] = 0; /* col offset, first column*/

  stride[0] = 1; /* select every 1 element, don't skip any row*/
  stride[1] = 1; /* and don't skip any elements on columns */

  count[0]  = 1; /* select only one block per dimension */
  count[1]  = 1; /* supposing 1 block means one entire row with this */

  block[0]  = 1; /* size of the row block */
  block[1]  = 3; /* column block size */

  /* select a slab */
  status = H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET,
                               offset, stride, count, block);

  /* write! */
status = H5Dwrite(dataset_id, H5T_STD_I32BE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
                    newdata);

  /* close dataset */
  status = H5Dclose (dataset_id);

  /* close dataspace */
  status = H5Sclose(dataspace_id);

  /* close file */
  status = H5Fclose(file_id);

  return 0;
}






_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5

Reply via email to