使用 Matlab 读取 HDF5 容器中的单个文件

Read a single file in HDF5 container with Matlab

我正在尝试从我之前编写的 HDF5 容器中读取单个文件。我虽然这很简单:从文件大小和文件索引中导出索引并读取 HDF5 文件的相应部分。

file = h5read(filename, datasetname, ...
         [ones(1, length(dataSize)-1) fileIdx], [dataSize(1:end-1) fileIdx]);

在以下示例中,这转换为 h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 4]);

% info for myfile.h5
h5disp('myfile.h5');

% HDF5 myfile.h5.h5 
% Group '/' 
% Dataset 'data' 
%     Size:  1024x1024x4x5
%     MaxSize:  1024x1024x4x5
%     Datatype:   H5T_IEEE_F64LE (double)
%     ChunkSize:  1024x1024x4x1
%     Filters:  deflate(1)
%     FillValue:  0.000000

% read in myfile.h5:
h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 4]);

... 并且对前三个图块非常有效,但对第四个图块会引发错误:

Error using h5readc
The index arguments exceed the size of the dataset.

Error in h5read (line 58)
[data,var_class] = h5readc(Filename,Dataset,start,count,stride);
...

但是,前面的 h5disp('myfile.h5'); 表明,HDF5 容器与我在

中使用的那些文件中的 5 个文件 (1024x1024x4x5) 一样大
info = h5info(filename, datasetname); 
dataSize = info.Dataspace.Size; 

HDF5 容器没问题。读取所有文件然后在 Matlab 中访问 BLOB 之前工作正常。

data = h5read(filename, datasetname);
file = data(:,:,:,fileIndex);

正如我所说,我的方法适用于前三个图块,但后来失败了。我是不是忽略了什么?

再看一遍doc h5read。您似乎误解了 startcount 参数。

start是从哪里开始读取数据,count是要读取多少数据。当您请求 h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 4]); 时,您要求从第 4 个图块 ([1 1 1 4]) 的开头开始,然后读取 4 个完整图块 ([1024 1024 4 4])。由于数据集只有 5 个图块,这会给您带来超出尺寸的错误。

要阅读第 4 个图块,请尝试 h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 1]);