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

时间:2017-02-09 13:10:00

标签: matlab hdf5

我试图从我之前写过的HDF5容器中读取一个文件。我虽然这很简单:从filesize和fileindex派生索引并读取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);

正如我所说,我的方法适用于前三个瓷砖,但随后失败了。我在这里忽略了什么吗?

1 个答案:

答案 0 :(得分:3)

再次查看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]);