代码之家  ›  专栏  ›  技术社区  ›  Doug Null

如何从C#中使用HDF5DotNet读取HDF5多维数组数据集。网

  •  0
  • Doug Null  · 技术社区  · 7 年前

    我需要读取一个包含3 x 3数组的HDF5数据集,数据类型是double。

    从下面的代码返回时,我的Visual Studio 2017 Pro崩溃。

    使用调试器,该代码从HDF5读取2-dim阵列;我可以在调试器中读取它;但函数read_double_数组返回调用方时崩溃。

    示例中的第二次代码尝试 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;
    }
    

    我的代码第一次尝试失败了

    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 回复  |  直到 7 年前
        1
  •  0
  •   Doug Null    7 年前

    我成功了。这是我的密码。。。

        // 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;
    }
    
        2
  •  -1
  •   SOG    4 年前

    让自己免于严重的痛苦(由于HDF5低级别的实现细节),然后离开 HDFql .

    下面是一个在C#中使用HDFql读取名为 dset 在名为 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;
    
            // select (i.e. read) dataset "dset" from HDF5 file "test.h5" into variable "data"
            HDFql.Execute("SELECT FROM test.h5 dset INTO MEMORY " + HDFql.VariableTransientRegister(data));
    
            // display content of variable "data"
            for(x = 0; x < 3; x++)
            {
                for(y = 0; y < 3; y++)
                {
                    System.Console.WriteLine(data[x, y]);
                }
            }
        }
    }
    
    推荐文章