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

使用Matlab将数据附加到hdf5容器,matlab,hdf5,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 = '

我使用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\u img
都被写入文件。但是,我现在想向同一数据集中添加更多图像,不知道所创建文件的大小
n_imgs
(附加脚本独立于创建脚本访问文件)

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

我对如何确定这些参数感到困惑。在他们树立的榜样中

start = [1 j];  % probably translates to [1 n_imgs]?
count = [20 1]; % translates to [img ?]
在我的示例中如何设置这些参数

  • 如果我知道
    n\u imgs
  • 如果我不知道
    n\u imgs

  • start
    是数据中开始写入文件的位置
    count
    是您将写入文件的数据量

    假设
    n\u imgs
    已写入文件,并且您希望追加,
    start
    将是
    [1 n\u 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]
    

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

    假设
    n\u imgs
    已写入文件,并且您希望追加,
    start
    将是
    [1 n\u 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]
    

    太好了,这正是我需要的。谢谢你的解释!太好了,这正是我需要的。谢谢你的解释!