gpt4 book ai didi

c++ - 将 3D 数组写入 HDF5

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:50 36 4
gpt4 key购买 nike

我正在尝试将 3D 数据集写入 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 容器中。这一定可以使用 hyperslabs,但我不确定如何

编辑 2

由于数据具有结构,我可以在 HDFView 中以图像形式查看数据。以下应该有助于说明问题:

编辑 3

联系了 HDF 小组,发现在当前的实现中无法移动维度。必须在写入数据集之前完成。

Expected vs Actual results

最佳答案

数据集中的元素未按预期顺序排列,因为指定了不正确的内存数据空间。

user guide在第 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 中相同的数组存储约定:

Dataspace dimensions are numbered from 1 to rank. HDF5 uses C storage conventions, assuming that the last listed dimension is the fastest-changing dimension and the first-listed dimension is the slowest changing. The HDF5 file format storage layout specification adheres to the C convention and the HDF5 Library adheres to the same convention when storing dataspace dimensions in the file.

修改后的代码应该是这样的:

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));

关于c++ - 将 3D 数组写入 HDF5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43501203/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com