4

我正在尝试使用 Matlab 读取 HDF5 文件。我在 Fortran 中创建了文件,这仅与我过去h5dsattach_scale_f将比例数据集附加到给定主数据集的每个维度有关。我的大部分逻辑都运行良好,但我无法读取主要数据集的属性以获取附加的比例。

我首先遍历文件中的每个数据集。一旦我知道我有我的主数据集,我就会用这个调用遍历它的属性:

[status, index_out, SD] = H5A.iterate(dset_id, 'H5_INDEX_NAME', 'H5_ITER_NATIVE', 0, @hdf5_sds_attr_iter, SD);

为每个属性调用此函数:

function [status, SD] = hdf5_sds_attr_iter(dset_id, attr_name, info, SD)
    status = 0;
    disp(attr_name);

    if ~strcmp(attr_name, 'DIMENSION_LIST')
        return;
    end
    attr_id = H5A.open(dset_id, attr_name, 'H5P_DEFAULT');

    space = H5A.get_space (attr_id);
    [~, dims, ~] = H5S.get_simple_extent_dims(space);

    info2 = H5A.get_info(attr_id);
    disp(info2);
    rdata = H5A.read(attr_id, 'H5ML_DEFAULT');
    disp(rdata);
    for i = 1:dims
        disp(rdata{i});
    end
    H5S.close(space);
    H5A.close(attr_id);
end

这是输出:

DIMENSION_LIST
     3

    corder_valid: 1
          corder: 0
            cset: 0
       data_size: 48

    [8x1 uint8]
    [8x1 uint8]
    [8x1 uint8]

  184
   17
    0
    0
    0
    0
    0
    0

   32
   28
    0
    0
    0
    0
    0
    0

  240
   29
    0
    0
    0
    0
    0
    0

如果我对数据集执行 h5dump,则该属性如下所示:

  ATTRIBUTE "DIMENSION_LIST" {
     DATATYPE  H5T_VLEN { H5T_REFERENCE { H5T_STD_REF_OBJECT }}
     DATASPACE  SIMPLE { ( 3 ) / ( 3 ) }
     DATA {
     (0): (DATASET 1400 /beamdata scale rank 1 ),
     (1): (DATASET 6512 /beamdata scale rank 2 ),
     (2): (DATASET 6976 /beamdata scale rank 3 )
     }
  }

由于这些数字(1400、6512、6976)没有出现在转储的其他地方,我不知道如何使用它们或H5A.read( rdata) 的输出来实际获取比例数据。Matlab HDF5 文档对如何处理属性数据相当沉默。有谁知道如何正确处理属性引用数据?

4

0 回答 0