【问题标题】:Append data to hdf5 container with Matlab使用 Matlab 将数据附加到 hdf5 容器
【发布时间】:2017-06-19 22:15:02
【问题描述】:

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

【问题讨论】:

    标签: matlab hdf5


    【解决方案1】:

    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]
    

    【讨论】:

    • 太棒了,这正是我所需要的。谢谢你的解释!
    猜你喜欢
    • 2013-02-26
    • 2018-02-22
    • 2014-10-26
    • 2020-09-13
    • 2014-07-19
    • 2017-10-02
    • 2011-11-11
    • 2022-11-12
    • 2018-04-14
    相关资源
    最近更新 更多