我正在尝试将三维数据集写入HDF5文件。写入成功,并且文件中的维度都是正确的,然而,当使用HDFView工具时,数据是乱七八糟的,但是有一个可识别的结构,所以我必须接近。我不知道我错过了什么,也找不到一个很好的例子来写3D数据。
数据是一个连续的内存块,按如下方式索引:data[layer][row][col]
或data[layer*rows*cols + row*cols + col]
下面是我使用的代码,其中HDF5_CHECK是一个宏,它在错误时抛出异常。
const hsize_t dim[] = { rows, cols, layers };
hid_t space = H5Screate_simple(3, dim, NULL);
hid_t dataset = H5Dcreate(file, "dataset", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
HDF5_CHECK(dataset);
HDF5_CHECK(H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, data));
HDF5_CHECK(H5Sclose(space));
HDF5_CHECK(H5Dclose(dataset));
编辑
我认为这个问题与索引有关。C++中的数组是正确的。但是,我相信我想将Z,Y,X数据作为Y,X,Z存储在HDF5容器中。这肯定是可能的,但是我不知道怎么做到的。
编辑2
由于数据具有结构,所以我可以在HDFView中将数据视为图像。以下应有助于说明这一问题:
编辑3
联系了人类发展框架小组,发现在目前的实施中不可能改变维度。必须在写入数据集之前完成此操作。
发布于 2017-04-20 14:29:44
由于指定了不正确的内存数据空间,dataset中的元素没有按预期顺序排列。
第4节中的用户指南展示了HDF5如何在两个大小相同的数据空间之间进行读取,但在文件到内存之间交换维度。实际上,H5Dwrite
函数声明如下:
herr_t H5Dwrite(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, const void * buf )
第三个参数引用内存数据空间,在我们的例子中,内存数据空间与文件的数据空间不一样(以前定义为(row, col, layer)
)。相反,应该将其定义为(layer, row, col)
。指南中的同一页澄清了HDF5遵循与C中相同的数组存储约定:
数据空间尺寸从1编号到等级。HDF5使用C存储约定,假设最后列出的维度是变化最快的维度,而第一个列出的维度是变化最慢的维度。HDF5文件格式存储布局规范遵循C约定,而HDF5库在文件中存储数据空间尺寸时遵循相同的约定。
修正后的代码应该如下所示:
const hsize_t dim[] = { rows, cols, layers };
hid_t space = H5Screate_simple(3, dim, NULL);
hid_t dataset = H5Dcreate(file, "dataset", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
HDF5_CHECK(dataset);
const hsize_t mem_dim[] = { layers, rows, cols };
hid_t mem_space = H5Screate_simple(3, dim, NULL);
HDF5_CHECK(H5Dwrite(dataset, type, mem_space, H5S_ALL, H5P_DEFAULT, data));
https://stackoverflow.com/questions/43501203
复制相似问题