2017-02-08 1 views
0

Pourriez-vous s'il vous plaît me fournir un exemple de lecture d'un seul élément à partir du fichier HDF5 en utilisant la bibliothèque HDF5DotNet. Je sais lire le tableau complet dans la mémoire et sélectionner l'élément nécessaire par index. Le problème que je ne veux pas lire le tableau complet et souhaitez utiliser la méthode H5S.selectElements (http://hdf5.net/api/M_HDF5DotNet_H5S_selectElements_4_9e6f2387.aspx).
Jusqu'à présent, j'ai créé ce qui suit:Lecture d'un seul élément à partir du fichier HDF5

H5.Open(); 
H5FileId fileId = H5F.open(this.filePath, H5F.OpenMode.ACC_RDONLY); 
var dSet = H5D.open(fileId, "/Link"); 
var dSpace = H5D.getSpace(dSet); 
var dDims = H5S.getSimpleExtentDims(dSpace); 
var dType = H5D.getType(dSet); 

H5S.selectElements(dSpace, H5S.SelectOperator.SET, InpPtr numElements,long [] coord); 

Je ne peux pas comprendre comment définir le paramètre numElements et coord de l'élément (je 3 tableau à deux dimensions).

Répondre

1

Utilisation du HDF5 support doc

En supposant que votre DataSet est comme suit: (2D pour la simplicité expliquant comment les paramètres de travail)

1 2 3 
4 5 6 
7 8 9 

Et vous vouliez choisir le et seul le . Cela signifie que vous voulez un élément situé dans la deuxième ligne et la troisième colonne. (Un indexé). Cela signifie que vous aurez besoin d'une matrice de points de 1 par 2 dans le tableau de sélection. (Zéro indexé).

1 2 

Si vous souhaitez également sélectionner le 7, le tableau de sélection doit ressembler à ceci. (Zéro indexé).

1 2 2 0 

Les appels correspondants seraient:

H5S.selectElements(dSpace, H5S.SelectOperator.SET, 1, new long [] { 1, 2 }); 
H5S.selectElements(dSpace, H5S.SelectOperator.SET, 2, new long [] { 1, 2, 2, 0 }); 

Traduire à un DataSpace 3D, nous ajoutons juste une valeur ajoutée au tableau de sélection.

C'est:

1 2 0 

choisira le point (2,3,1)

Si vous voulez sélectionner une deuxième valeur, le tableau de sélection ressemblerait à ceci. (Zéro indexé).

1 2 0 1 2 1 

Sélectionne les points (2,3,1), (2,3,2).

Les appels correspondants seraient:

H5S.selectElements(dSpace, H5S.SelectOperator.SET, 1, new long [] { 1, 2, 0 }); 
H5S.selectElements(dSpace, H5S.SelectOperator.SET, 2, new long [] { 1, 2, 0, 1, 2, 1 }); 

Remarque: que je ne l'ai jamais utilisé HDF5, décrivant appel en fonction de la documentation, donc il peut y avoir des erreurs.

+0

Merci pour votre réponse. –

+0

Mon plaisir. En outre, vous pouvez noter des avantages/inconvénients avec la méthode que vous avez utilisée. –

0

J'ai trouvé une autre approche pour résoudre le problème - en utilisant la méthode H5S.selectHyperslab. Peut-être que ce n'est pas si élégant mais ça a l'air de bien fonctionner.

H5.Open(); 
H5FileId fileId = H5F.open(this.filePath, H5F.OpenMode.ACC_RDONLY); 
var dSet = H5D.open(fileId, "/Link"); 
var dSpace = H5D.getSpace(dSet); 
var dDims = H5S.getSimpleExtentDims(dSpace); 
var dType = H5D.getType(dSet); 
//E.g. to extract the value with coordinates [0,1,0]: 
H5DataSpaceId memspaceid = H5S.create_simple(1, new long[] { 1, 1, 1 }); 
H5S.selectHyperslab(memspaceid, H5S.SelectOperator.SET, new long[] { 0, 1, 0 }, new long[] { 1, 1, 1 }); 
H5S.selectHyperslab(dSpace, H5S.SelectOperator.SET, new long[] { 0, 1, 0 }, new long[] { 1, 1, 1 }); 

//array to read data 
double[] readDataBank = new double[1]; 
H5DataTypeId typeId = new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE); 
H5D.read(dSet, dType, memspaceid, dSpace,new H5PropertyListId(new H5P.Template()), new H5Array<double>(readDataBank)); 
0

Utilisation HDFql en C#, la lecture d'un élément particulier d'un ensemble de données à trois dimensions peut être fait comme suit (en supposant que l'ensemble de données est appelée my_dataset et l'élément de lecture est en position 2, 3 et 5 dans le premier, deuxième et troisième dimension, respectivement):

HDFql.Execute("SELECT FROM my_dataset(2, 3, 5)"); 

de là, on peut récupérer l'élément en procédant comme suit (en supposant que my_dataset est de nombre entier de type de données):

HDFql.CursorFirst(); 
System.Console.WriteLine("Element is " + HDFql.CursorGetInt());