【发布时间】:2017-09-16 00:09:03
【问题描述】:
我正在尝试将 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 小组,发现在当前实施中无法进行维度转换。必须在写入数据集之前完成。
【问题讨论】:
-
data是如何声明的?每个元素的预期原始类型是什么? -
类型实际上是模板化的。
data被声明为向量,但是,在此方法的上下文中,const T* -
由于数据是模板化的,你如何定义
type?我们还能看到数据样本及其“混乱”形式吗? -
我发布的方法是类私有的,具有一堆重载(每种数据类型一个),这些重载转发给提供 HDF 类型的此方法。由于索引更改,数据混乱。请查看我的编辑。
-
对不起,我的意思是我还不明白数据在数据集中(错误地)的组织方式。假设 3D 数据集中的每个位置都为
T类型的一个实例腾出空间,那么很难理解为什么索引是一个问题。一个具体的例子会很有帮助。