2017-02-09 96 views
1

我正在尝试从我之前编写的HDF5容器中读取单个文件。我虽然这很简单:从文件大小和文件索引中获取索引并读取HDF5文件的相应部分。用Matlab读取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容器与那些文件(1024x1024x4x5)中的5个一样大,我正在使用

info = h5info(filename, datasetname); 
dataSize = info.Dataspace.Size; 

HDF5容器是好的。读取所有文件,然后在Matlab中访问BLOB,然后再正常工作。

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

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

回答

2

再看看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个图块,因此会给您的尺寸超出错误。

要阅读第四个瓷砖只尝试h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 1]);

+1

这正是错误的。对不起,谢谢... – Honeybear