2014-04-23 28 views
1

學習ILNumerics HDF5 API。我非常喜歡使用C#對象初始化器在一個表達式中設置複雜的HDF5文件的選項。我創建以下文件:如何過濾HDF5文件中的特定對象

using (var f = new H5File("myFile.h5")) { 

    f.Add(new H5Group("myTopNode") { 
     new H5Dataset("dsNo1", ILMath.vec<float>(1,200)), // no attributes 
     new H5Group("myGroup") { 
      new H5Dataset("dsYes", ILMath.rand(100,200)) { // matching dataset 
       Attributes = { 
        { "att1", 1 }, 
        { "att2", 2 } 
       } 
      }, 
      new H5Dataset("dsNo2") { // attributes but wrong name 
       Attributes = { 
        { "wrong1", -100 }, 
        { "wrong2", -200 } 
       } 
      } 
     } 
    }); 
} 

現在我正在尋找一個聰明的方法來遍歷文件和過濾器具有特殊性能的數據集。 我想找到所有具有至少一個名稱爲「att」的屬性的數據集,收集並返回它們的內容。這是我到目前爲止:

IList<ILArray<double>> list = new List<ILArray<double>>(); 
using (var f = new H5File("myFile.h5")) { 
    var groups = f.Groups; 
    foreach (var g in groups) { 
     foreach (var obj in g) { 
      if (obj.H5Type == H5ObjectTypes.Dataset && obj.Name.Contains("ds")) { 
       var ds = obj as H5Dataset; 
       // look for attributes 
       foreach (var att in ds.Attributes) { 
        //ds.Attributes["att"]. 
        if (att.Name.Contains("att")) { 
         list.Add(ds.Get<double>()); 
        } 
       } 
      } 
     } 
    } 
} 
return list; 

但它不能遞歸地工作。我可以採用它,但ILNumerics聲稱是方便的,所以必須有更好的方法?在python中類似於h5py的東西?

回答

1

H5Group提供了Find<T>方法,它只是你要找的。它遍歷整個子樹,以任意斷言到:

var matches = f.Find<H5Dataset>(
       predicate: ds => ds.Attributes.Any(a => a.Name.Contains("att"))); 

爲什麼不把你的函數返回「ILCell」,而不是「清單」?這更很好地集成到ILNumerics內存管理(不會有存儲奠定周圍,等待垃圾回收器來用):

using (var f = new H5File("myFile.h5")) { 
    // create container for the dataset contents 
    ILCell c = cell(size(1, 1)); // one element init 

    // retrieve datasets filtered 
    var matches = f.Find<H5Dataset>(predicate: ds => { 
     if (ds.Attributes.Any(a => a.Name.Contains("att"))) { 
      c[end + 1] = ds.Get<double>(); 
      return true; 
     } 
     return false; 
    }); 
    return c; 
} 

一些鏈接:

http://ilnumerics.net/hdf5-interface.html

http://ilnumerics.net/Cells.html

http://ilnumerics.net/GeneralRules.html

相關問題