我正在尝试从我之前编写的 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]);
...对于前三个图 block 效果很好,但对于第四个图 block 会抛出错误:
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);
正如我所说,我的方法适用于前三个图 block ,但随后失败了。我在这里忽略了什么吗?
最佳答案
再次查看doc h5read
。您似乎误解了 start
和 count
参数。
start
是开始读取数据的位置,count
是读取数据量。当您请求 h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 4]);
时,您要求从第四个图 block 的开头开始([1 1 1 4]
),然后读取 4 个完整图 block ([1024 1024 4 4]
)。由于数据集只有 5 个图 block ,这会给您带来尺寸超出错误。
要读取第四个图 block ,请尝试 h5read('myfile.h5', '/data', [1 1 1 4] , [1024 1024 4 1]);
关于matlab - 使用 Matlab 读取 HDF5 容器中的单个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137631/