Hi Jim,

On Apr 22, 2010, at 1:02 PM, James Bullard wrote:

> Hi,
> 
> I am clearly misunderstanding something about reading datasets and
> converting their write order in a buffer using dataspaces. I am
> attempting to convert between a row-major memory layout to a column
> major memory layout and am incapable. In the documentation here:
> 
> http://www.hdfgroup.org/HDF5/doc/UG/12_Dataspaces.html
> 
> "Figure 4a shows a simple example of a read operation in which the data
> is stored as a 3 by 4 array in the file (Figure 4b), but the program
> wants it to be a 4 by 3 array in memory. This is accomplished by setting
> the memory dataspace to describe the desired memory layout, as in Figure
> 4c. The HDF5 Library will transform the data to the correct arrangement
> during the read operation"
> 
> As an example, I took the program: h5ex_d_rdwr.c from:
> 
> http://www.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/C/H5D/h5ex_d_rdwr.c
> 
> I modified it to include the following lines (fully modified program is
> attached).
> 
> hid_t memspace  = H5Screate_simple(2, rdims, NULL);
> hid_t filespace = H5Dget_space(dset); 
> H5Dread(dset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT,
>       rdata[0]);
> 
> Here rdims is simply the original dims in reverse. When I do this,
> nothing changes in the way that the matrix is printed. I feel I must be
> missing something, but I can't find any examples doing this
> transposition. I am using hdf 1.8.4 on linux. 
> 
> Full program attached, Thanks again. 

        The HDF5 library won't transpose data during reads/writes.  What your 
program is doing is telling the library that the array is different shapes, not 
transposed.

        Quincey


> jim
> #include "hdf5.h"
> #include <stdio.h>
> #include <stdlib.h>
> 
> #define FILE            "h5ex_d_rdwr.h5"
> #define DATASET         "DS1"
> #define DIM0            4
> #define DIM1            7
> 
> int
> main (void)
> {
>    hid_t       file, space, dset;          /* Handles */
>    herr_t      status;
>    hsize_t     dims[2] = {DIM0, DIM1};
>    hsize_t     rdims[2] = {DIM1, DIM0};
>    int         wdata[DIM0][DIM1],          /* Write buffer */
>                rdata[DIM0][DIM1],          /* Read buffer */
>                i, j;
> 
> 
>    int* xdata = (int *) calloc(DIM0*DIM1, sizeof(int));
> 
>    /*
>     * Initialize data.
>     */
>    for (i=0; i<DIM0; i++)
>        for (j=0; j<DIM1; j++)
>            wdata[i][j] = i * j - j;
> 
>    /*
>     * Create a new file using the default properties.
>     */
>    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
> 
>    /*
>     * Create dataspace.  Setting maximum size to NULL sets the maximum
>     * size to be the current size.
>     */
>    space = H5Screate_simple (2, dims, NULL);
> 
>    /*
>     * Create the dataset.  We will use all default properties for this
>     * example.
>     */
>    dset = H5Dcreate (file, DATASET, H5T_STD_I32LE, space, H5P_DEFAULT,
>                     H5P_DEFAULT, H5P_DEFAULT);
> 
>    /*
>     * Write the data to the dataset.
>     */
>    status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
>                      wdata[0]);
> 
>    /*
>     * Close and release resources.
>     */
>    status = H5Dclose (dset);
>    status = H5Sclose (space);
>    status = H5Fclose (file);
> 
> 
>    /*
>     * Now we begin the read section of this example.
>     */
> 
>    /*
>     * Open file and dataset using the default properties.
>     */
>    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
>    dset = H5Dopen (file, DATASET, H5P_DEFAULT);
> 
>    /*
>     * Read the data using the default properties.
>     */
>    status = H5Dread (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
>                     rdata[0]);
>    status = H5Dread (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
>                     xdata);
>    /*
>     * Output the data to the screen.
>     */
>    printf ("%s:\n", DATASET);
>    for (i=0; i<DIM0; i++) {
>        printf (" [");
>        for (j=0; j<DIM1; j++)
>            printf (" %3d", rdata[i][j]);
>        printf ("]\n");
>    }
> 
>    for (i = 0; i < DIM0*DIM1; i++) {
>       printf(" %d", xdata[i]);
>    }
>    printf ("\n");
> 
> 
>    hid_t memspace  = H5Screate_simple(2, rdims, NULL);
>    hid_t filespace = H5Dget_space(dset); 
>    H5Dread(dset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT,
>           rdata[0]);
>    H5Dread(dset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT,
>           xdata);
> 
> 
>    /*
>     * Output the data to the screen.
>     */
>    printf ("Thought it would be reversed dataset %s:\n", DATASET);
>    for (i=0; i<DIM0; i++) {
>        printf (" [");
>        for (j=0; j<DIM1; j++)
>            printf (" %3d", rdata[i][j]);
>        printf ("]\n");
>    }
> 
>    for (i = 0; i < DIM0*DIM1; i++) {
>       printf(" %d", xdata[i]);
>    }
>    printf ("\n");
> 
> 
>    /*
>     * Close and release resources.
>     */
>    status = H5Dclose (dset);
>    status = H5Fclose (file);
> 
>    return 0;
> }
> _______________________________________________
> Hdf-forum is for HDF software users discussion.
> [email protected]
> http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org


_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Reply via email to