2017-02-08 303 views
0

您能否给我提供一个使用HDF5DotNet库从HDF5文件中读取单个元素的示例。我知道如何将完整的数组读入内存并按索引选择必要的元素。这个问题我不想读全数组,并且想使用H5S.selectElements方法(http://hdf5.net/api/M_HDF5DotNet_H5S_selectElements_4_9e6f2387.aspx)。
到目前为止我已经创建了以下内容:从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); 

我不能找出如何定义的元素的参数包含numElements和坐标(我有3维阵列)。

回答

1

使用HDF5 support doc

假设你的数据集如下:(2D为了简单解释参数的工作)

1 2 3 
4 5 6 
7 8 9 

而且你想选择,只有 。 这意味着你想要一个元素位于第二行和第三列。 (一个索引)。

这意味着您将需要选择阵列中的1乘1的点数组。 (零索引)。

1 2 

如果您还想选择7,那么选择数组将如下所示。 (零索引)。

1 2 2 0 

的相关电话是:

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

翻译成3D数据空间,我们只是增加一个额外的价值来选择阵列。

即:

1 2 0 

会选择点(2,3,1)

如果你想选择第二值,则选择阵列是这样的。 (零索引)。

1 2 0 1 2 1 

将选择点(2,3,1),(2,3,2)。

的相关电话是:

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

注意:那我从来没有使用HDF5,描述基于文档调用,因此有可能是错误的。

+0

感谢您的回答。 –

+0

我的快乐。另外,您可能需要注意您使用的方法的优缺点。 –

0

我发现了另一种解决问题的方法 - 使用H5S.selectHyperslab方法。也许它不是很优雅,但它似乎工作正常。

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

在C#使用HDFql,读取三维数据集的一个特定元件可以做如下(假设数据集被称为my_dataset和读取元件是在位置2,3和5第一,第二和第三分别尺寸):

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

从那里,可以检索通过执行以下操作的元件(假设my_dataset是数据类型整数):

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