我试图从我之前写过的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);
正如我所说,我的方法适用于前三个瓷砖,但随后失败了。我在这里忽略了什么吗?
答案 0 :(得分:3)
再次查看doc h5read
。您似乎误解了start
和count
参数。
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]);