使用 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 需要参数 start
和 count
(doc 在这里)。
我对如何确定这些参数感到困惑。在示例中,他们设置
start = [1 j]; % probably translates to [1 n_imgs]?
count = [20 1]; % translates to [img ?]
如何在我的示例中设置这些参数?
- 如果我知道
n_imgs
?
- 如果我不知道
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]
我使用 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 需要参数 start
和 count
(doc 在这里)。
我对如何确定这些参数感到困惑。在示例中,他们设置
start = [1 j]; % probably translates to [1 n_imgs]?
count = [20 1]; % translates to [img ?]
如何在我的示例中设置这些参数?
- 如果我知道
n_imgs
? - 如果我不知道
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]