2B dizi veri kümesi dosyalarını yazmak için HDF5 C++ API kullanıyorum. HDF Grubu, gereksinimlerimi karşılamak için değiştirdiğim statik olarak tanımlanmış bir dizi boyutundan an example to create bir HDF5 dosyasına sahiptir. Ancak, dinamik bir diziye ihtiyacım var, burada hem NX
hem de NY
çalışma zamanında belirlendi. Dinamik bir dizi oluşturmaya yardımcı olmak için another solution to create 2D arrays using the "new" keyword buldum.HDF5 C++ arabirimi: dinamik 2B dizilerini yazma
#include "StdAfx.h"
#include "H5Cpp.h"
using namespace H5;
const H5std_string FILE_NAME("C:\\SDS.h5");
const H5std_string DATASET_NAME("FloatArray");
const int NX = 5; // dataset dimensions
const int NY = 6;
int main (void)
{
// Create a 2D array using "new" method
double **data = new double*[NX];
for (int j = 0; j < NX; j++) // 0 1 2 3 4 5
{ // 1 2 3 4 5 6
data[j] = new double[NY]; // 2 3 4 5 6 7
for (int i = 0; i < NY; i++) // 3 4 5 6 7 8
data[j][i] = (float)(i + j); // 4 5 6 7 8 9
}
// Create HDF5 file and dataset
H5File file(FILE_NAME, H5F_ACC_TRUNC);
hsize_t dimsf[2] = {NX, NY};
DataSpace dataspace(2, dimsf);
DataSet dataset = file.createDataSet(DATASET_NAME, PredType::NATIVE_DOUBLE,
dataspace);
// Attempt to write data to HDF5 file
dataset.write(data, PredType::NATIVE_DOUBLE);
// Clean up
for(int j = 0; j < NX; j++)
delete [] data[j];
delete [] data;
return 0;
}
sonuç dosyası Ancak beklenmediği (hdf5dump
çıktısı):
HDF5 "SDS.h5" {
GROUP "/" {
DATASET "FloatArray" {
DATATYPE H5T_IEEE_F64LE
DATASPACE SIMPLE { (5, 6)/(5, 6) }
DATA {
(0,0): 4.76465e-307, 4.76541e-307, -7.84591e+298, -2.53017e-098, 0,
(0,5): 3.8981e-308,
(1,0): 4.76454e-307, 0, 2.122e-314, -7.84591e+298, 0, 1,
(2,0): 2, 3, 4, 5, -2.53017e-098, -2.65698e+303,
(3,0): 0, 3.89814e-308, 4.76492e-307, 0, 2.122e-314, -7.84591e+298,
(4,0): 1, 2, 3, 4, 5, 6
}
}
}
}
sorun 2D array nasıl oluşturulduğuna geri sapları (bu yana İşte ne var örnek bir statik dizi yöntemi ile iyi çalışıyor). Ben this email thread anladığımız gibi:
HDF5 kütüphane elemanlarının bitişik bir dizide beklediğini, alt boyutlarda elemanlarına değil işaretçileri
C++/HDF5 oldukça yeni olduğum için, ben Bitişik bir dizi eleman olan çalışma zamanında dinamik olarak boyutlandırılmış bir dizinin nasıl oluşturulacağından emin değilsiniz. Çok karmaşık göründüğünden, e-posta dizisinde açıklanan daha karmaşık "hiperslab" yöntemini yapmak istemiyorum. Herhangi bir yardım takdir edilir.
Bu çözüm uygulamak kolaydır ve (Ben de gerçekten ölçekler 21.9M elemanları ile dizi boyutları kullanarak). Sonuç, HDF5 dosya çıkışında mükemmel bir şekilde doğrulanır. –
Bir çekicilik gibi çalışır. Teşekkür ederim. – CuriousCase
Bunun çok eski olduğunu biliyorum, ama sanırım son cümlede bir hata var. Olması gereken: (yerine [i] [j] ') –