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:
Die resultierende Datei ist jedoch nicht wie erwartet (Ausgabe von hdf5dump
):
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.
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
)
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):
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%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 .
Tags und Links c++ multidimensional-array hdf5 dynamic-data