Как прочитать набор данных многомерного массива HDF5, используя HDF5DotNet из C # .net? - PullRequest
0 голосов
/ 15 января 2019

Мне нужно прочитать набор данных HDF5, который содержит массив 3 x 3, тип данных double.

Мой Visual Studio 2017 Pro дает сбой при возврате из моего кода ниже.

С помощью отладчика этот код считывает 2-мерный массив из HDF5; Я могу прочитать это в отладчике; но функция read_double_array аварийно завершает работу, когда возвращается к вызывающей стороне.

2-Й КОД ПОПЫТКА ОТ ПРИМЕРА НА STACKO ….

    public static double[,]  read_double_array( H5FileId fileId, string dataset_name, int dim1, int dim2 )
{
    double [,] return_data = new double[ dim1, dim2 ];
    try
    {
        H5Array<double> h5_array = new H5Array<double>( return_data );
        H5DataSetId double_array_dataset  = H5D.open( fileId, dataset_name );
        H5D.read<double>(   double_array_dataset, 
                            new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE), 
                            h5_array );
        H5D.close(double_array_dataset);

    }
    catch( HDFException e )
    {
        Console.WriteLine( e.Message );
        int aa=0;
    }
    return return_data;
}

МОЙ КОД 1-Й ПОПЫТКА, КОТОРЫЙ ПОТЕРЯЛ ...

public static double[,]  read_double_array( H5FileId fileId, string dataset_name, int dim1, int dim2 )
{
        double [,] return_data = new double[ dim1, dim2 ];
    try
    {
        H5DataSetId dataSetId  = H5D.open( fileId, dataset_name );
        H5D.read(   dataSetId, 
                    new H5DataTypeId( H5T.H5Type.NATIVE_DOUBLE ),
                    new H5Array<double>( return_data ) );
    }
    catch( HDFException e )
    {
        Console.WriteLine( e.Message );
        int aa=0;
    }
    return return_data;  <<<<<<<<<<<<<<<<<<   H A N G S   H E R E
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я получил это работает. Вот мой код ...

    // Reads a 2-dim array of double.
// INPUT:  fileId of open HDF5 file
public static bool  read_double_array( H5FileId fileId, string dataset_name, int dim1, int dim2, ref double [,] output_double_array )
{

    try
    {
        output_double_array = new double[ dim1, dim2 ];
        H5Array<double> h5_array = new H5Array<double>( output_double_array );
        H5DataSetId dataset = H5D.open( fileId, dataset_name);
        H5D.read<double>(   dataset, 
                            new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE), 
                            h5_array);
    }
    catch( HDFException e )
    {
        Console.WriteLine( e.Message );
        return false;
    }
    return true;
}
0 голосов
/ 15 января 2019

Спасите себя от серьезной боли (из-за подробностей реализации низкого уровня HDF5) и проверьте HDFql .

Здесь представлено решение, использующее HDFql в C # для чтения многомерного (размер 3x3) набора данных с именем dset типа данных double, сохраненного в файле HDF5 с именем test.h5 (предположим, что файл и набор данных уже существуют) :

// use HDFql namespace (make sure it can be found by the C# compiler)
using AS.HDFql;

public class Test
{
    public static void Main(string []args)
    {
        // declare variables
        double [,]data = new double[3, 3];
        int x;
        int y;

        // use (i.e. open) HDF file "test.h5"
        HDFql.Execute("USE FILE test.h5");

        // register variable "data" for subsequent use (by HDFql)
        HDFql.VariableRegister(data);

        // select (i.e. read) dataset "dset" into variable "data"
        HDFql.Execute("SELECT FROM dset INTO MEMORY " + HDFql.VariableGetNumber(data));

        // unregister variable "data" as it is no longer used/needed (by HDFql)
        HDFql.VariableUnregister(data);

        // display content of variable "data"
        for(x = 0; x < 3; x++)
        {
            for(y = 0; y < 3; y++)
            {
                System.Console.WriteLine(data[x, y]);
            }
        }
    }
}
...