2017-02-02 1 views
0

J'ai créé un conteneur HDF5 en utilisant MATLAB. Contenu sont plusieurs images avec les dimensions [1024 1024 4] (= largeur, hauteur, canaux). J'ai créé et rempli l'ensemble de données comme ceci:Ajout de données au conteneur hdf5 avec Matlab

% 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); 

C'est tout bien, tout n_imgs sont écrites dans le fichier. Cependant, je veux maintenant ajouter d'autres images dans le même jeu de données, ne connaissant pas la taille n_imgs du fichier créé (le script annexe accède au fichier indépendamment du script de création).

Pour les anciennes versions, il y avait une option comme 'WriteMode', 'append', mais maintenant la h5write de fonction prend les paramètres start et count (doc est ici).

Je suis intriguée sur la façon de déterminer ces paramètres. Dans l'exemple, ils ont défini

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

Comment définir ces paramètres dans mon exemple?

  1. Si je connais n_imgs?
  2. Si je ne connais pas n_imgs?

Répondre

2

start est où dans les données que vous allez commencer à écrire dans le fichier. count est la quantité de données que vous allez écrire dans le fichier.

En supposant que n_imgs ont déjà été écrites dans le fichier et que vous souhaitez ajouter, start serait [1 1 1 n_imgs+1]. (c'est-à-dire commencer à écrire dans le fichier au début de l'image suivante). Supposons que vous souhaitiez ajouter 5 nouvelles images au fichier, count sera [1024 1024 4 5].

Si vous ne savez pas combien d'images ont été écrites à l'hdf5 précédemment, vous pouvez le regarder à l'aide h5info

Voici votre exemple et comment vous pouvez y ajouter du contenu:

% 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] 
+0

grand , c'est exactement ce dont j'avais besoin. Merci pour l'explication! – Honeybear