2017-02-08 134 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());