2017-04-19 125 views
1

我正在尝试将3D数据集写入HDF5文件。写入成功并且尺寸在文件中都是正确的,但是,当使用HDFView工具时,数据混乱,但具有可识别的结构,所以我必须关闭。我无法弄清楚我缺少什么,也无法找到写3D数据的好例子。将3D数组写入HDF5

数据是存储器索引作为这样的连续的块: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数据存储为HDF5容器中的Y,X,Z。这必须使用hyperslabs是可能的,但我不清楚如何

编辑2

由于数据具有结构,我可以如HDFView图像查看数据。以下应有助于显示问题:

编辑3

接触HDF组,发现了转移的尺寸是不可能在目前的执行情况。它必须在写入数据集之前完成。

Expected vs Actual results

+0

如何'data'声明?每个元素的原始类型是什么? –

+0

该类型实际上是模板化的。'data'被声明为一个向量,然而,在这个方法的上下文中'const T *' – steveo225

+0

由于数据是模板化的,你如何定义'type'?我们是否也可以看到数据样本及其“混乱”形式? –

回答

0

在数据集中的各元件没有按预期的顺序,因为指定了一个不正确的存储器数据空间。

第4节中的user guide显示了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)); 
+0

这也没有效果。事实上,它给了(似乎)相同的答案。我添加了一张图片,显示正在发生的事情和预期的事情。我忘了你可以指定不同的内存空间,并真的认为这是行得通的。 – steveo225

+0

我试着进一步改变mem_space来测试会发生什么。它似乎并不重要,我用mem_space,输出是相同的,即使'const hsize_t mem_dim [3] = {layers * rows * cols,1,1};' – steveo225

+0

这确实很有趣。在将数据集作为图像打开时,HDFView应该允许您分配每个图像维度。你尝试过每种可能的组合吗?我们离解决这个“谜”还有很远的距离。 :) –