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

Append data to hdf5 container with Matlab

我使用 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

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]