HDF5 C ++ - Schnittstelle: Schreiben von dynamischen 2D-Arrays

8

Ich verwende die HDF5 C ++ API , um 2D-Array-Dataset-Dateien zu schreiben. Die HDF Group hat ein Beispiel, um eine HDF5-Datei statisch zu erstellen definierte Array-Größe, die ich modifiziert habe, um meine Bedürfnisse unten zu erfüllen. Ich benötige jedoch ein dynamisches Array, in dem sowohl NX als auch NY zur Laufzeit ermittelt werden. Ich habe eine andere Lösung gefunden, um 2D-Arrays mit dem "new "Stichwort , um ein dynamisches Array zu erstellen. Hier ist was ich habe:

%Vor%

Die resultierende Datei ist jedoch nicht wie erwartet (Ausgabe von hdf5dump ):

%Vor%

Das Problem hängt damit zusammen, wie das 2D-Array erstellt wurde (da dieses Beispiel mit einer statischen Array-Methode funktioniert). Wie ich aus diesem E-Mail-Thread verstehe:

  

Die HDF5-Bibliothek erwartet ein zusammenhängendes Array von Elementen, nicht   Zeiger auf Elemente in niedrigeren Dimensionen

Da ich in C ++ / HDF5 ziemlich neu bin, bin ich mir nicht sicher, wie ich zur Laufzeit ein Array mit einer dynamischen Größe erstellen kann, das ein zusammenhängendes Array von Elementen ist. Ich möchte nicht die kompliziertere "hyperslab" -Methode, die im E-Mail-Thread beschrieben wird, machen, da dies zu kompliziert aussieht. Jede Hilfe wird geschätzt.

    
Mike T 14.09.2011, 06:18
quelle

3 Antworten

7

Nun, ich weiß nichts über HDF5, aber dynamische 2D-Arrays in C ++ mit einem zusammenhängenden Puffer können simuliert werden, indem ein 1D-Array der Größe NX * NY verwendet wird. Zum Beispiel:

Zuordnung:

%Vor%

Elementzugriff:

%Vor%

(anstelle von data[j][i] )

    
Doc Brown 14.09.2011, 06:32
quelle
6

So schreiben Sie N-Dimension-Arrays im HDF5-Format

Es ist viel besser, den Boost zu nutzen multi_array Klasse. Dies ist äquivalent zur Verwendung von std::vector anstelle von Raw-Arrays: Es übernimmt die gesamte Speicherverwaltung für Sie und Sie können Elemente so effizient wie Raw-Arrays mit vertrauten Subskriptionen (z. B. data[12][13] = 46 )

zugreifen

Hier ist ein kurzes Beispiel:

%Vor%

Die letzte Zeile ruft eine Funktion auf, die multi_array s jeder Dimension und jeden Standardnummerntyps schreiben kann ( ints , chars , floats usw.).

Hier ist Code für write_hdf5() .

Zuerst müssen wir C ++ - Typen den HDF5-Typen zuordnen (aus der H5 c ++ api):

%Vor%

Dann können wir ein bisschen Template-Forwarding-Magie verwenden, um eine Funktion des richtigen Typs zur Ausgabe unserer Daten zu machen. Da dies ein Vorlagencode ist, muss er in einer Headerdatei enthalten sein, wenn Sie HDF5-Arrays aus mehreren Quelldateien in Ihrem Programm ausgeben wollen:

%Vor%     
Leo Goodstadt 05.03.2013 10:09
quelle
2

Bei der wissenschaftlichen Programmierung ist es üblich, mehrdimensionale Arrays als ein großes 1D-Array darzustellen und dann den entsprechenden Offset von den mehrdimensionalen Indizes zu berechnen, z. wie in der Antwort von Doc Brown gesehen.

Alternativ können Sie den Indexoperator ( operator[]() ) überladen, um eine Schnittstelle bereitzustellen, die die Verwendung mehrdimensionaler Indizes ermöglicht, die vom 1D-Array unterstützt werden. Oder besser noch, verwenden Sie eine Bibliothek, die dies tut, wie zum Beispiel Boost multi_array . Oder wenn Ihre 2D-Matrizen Matrizen sind, können Sie eine schöne C ++ - Bibliothek für lineare Algebra verwenden, z. B. Eigen .

    
janneb 14.09.2011 12:32
quelle