2014-04-23 7 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는 편리하다고 주장하므로 더 좋은 방법이 있어야합니까? 파이썬에서 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