使用Matlab将数据附加到hdf5容器

时间:2017-02-02 17:50:27

标签: matlab hdf5

我使用MATLAB创建了一个HDF5容器。内容是多个尺寸为[1024 1024 4](=宽度,高度,通道)的图像。我创建并填充了这样的数据集:

% GENERATE DATA
img = double(ones([1024 1024 4]));             % example for image
imgs_dset = double(ones([size(img) n_imgs]);   % dataset [1024 1024 4 n_imgs]
datasetname = '/data';

% CREATE hdf5 container
% dset_size is 'Inf' so that container can hold arbitrary number of imgs
dset_size = [size(img) Inf];                   % = [1024 1024 4 Inf]
h5create(filename, datasetname, dset_size, 'Datatype', class(imgs_dset));

% FILL dataset
h5write(filename, datasetname, imgs_dset);

这一切都很好,所有n_imgs都写入文件。但是我现在想要将更多图像添加到同一数据集中,不知道创建文件的大小n_imgs (附加脚本独立于创建脚本访问文件)。

对于旧版本,有一个类似'WriteMode', 'append'的选项,但现在函数h5write需要参数startcountdoc在这里)。

我很困惑如何确定这些参数。在他们设置的例子中

start = [1 j];  % probably translates to [1 n_imgs]?
count = [20 1]; % translates to [img ?]

如何在我的示例中设置这些参数?

  1. 如果我知道n_imgs
  2. 如果我不知道n_imgs

1 个答案:

答案 0 :(得分:2)

start是您要开始写入文件的数据的位置。 count是您要写入文件的数据量。

假设n_imgs已写入文件并且您希望追加,start将为[1 1 1 n_imgs+1]。 (即,在下一个图像的开始处开始写入文件)。假设您希望在文件中附加5张新图片,count将为[1024 1024 4 5]

如果你不知道以前有多少图像写入hdf5,你可以使用h5info

查找

以下是您的示例以及如何附加到它:

% GENERATE DATA
n_imgs = 3;
img = double(ones([1024 1024 4]));             % example for image
imgs_dset = double(ones([size(img) n_imgs]));   % dataset [1024 1024 4 n_imgs]
datasetname = '/data';
filename = 'data.h5';

% CREATE hdf5 container
% dset_size is 'Inf' so that container can hold arbitrary number of imgs
dset_size = [size(img) Inf];                   % = [1024 1024 4 Inf]
h5create(filename, datasetname, dset_size, ...
         'Datatype', class(imgs_dset), 'ChunkSize', [1024 1024 1 1] );

% FILL dataset with first few images
h5write(filename, datasetname, imgs_dset, [1 1 1 1], [size(img) n_imgs]);

% APPEND to dataset
n_new_images = 5;
new_imgs_dset = double(ones([size(img) n_new_images]));
info = h5info('data.h5', '/data');
curSize = info.Dataspace.Size; % is currently [1024 1024 4 3].
h5write(filename, datasetname, new_imgs_dset, ...
             [1 1 1 curSize(end)+1], [size(img) n_new_images]);

% check size of dataset after appending:
info = h5info('data.h5', '/data');
disp(info.Dataspace.Size) % size is now [1024 1024 4 8]