【问题标题】:How do I store multiple data read from hdf5 files in one array?如何将从 hdf5 文件读取的多个数据存储在一个数组中?
【发布时间】:2015-11-02 13:37:07
【问题描述】:

我正在尝试从 HDF5 文件中预加载一堆矩阵并将它们存储在一个动态数组中。但是,我无法让它像我希望的那样工作。 由于某种我无法弄清楚的原因,整个数组而不是子数组被覆盖。任何想法如何解决这个问题?

这是我的代码:

short ***data[line_count];
short** dset_data;

for (int file_index = 0; file_index < line_count; ++file_index){
    dset_data = (short**) malloc(DIM_Y * sizeof(short*));
    dset_data[0] = (short*) malloc(DIM_Y * DIM_X * sizeof(short));
    for (int i=1; i < DIM_Y; i++)
      dset_data[i] = dset_data[0] + i * DIM_X;

    for (int y = 0; y < DIM_Y; y++) {
        for (int x = 0; x < DIM_X; x++) {
                dset_data[y][x] = 0;
        }
    }
    /* Open an existing file. */
    file_id = H5Fopen(input_files[file_index], H5F_ACC_RDONLY, H5P_DEFAULT);

    /* Open an existing dataset. */
    dataset_id = H5Dopen2(file_id, "data/data", H5P_DEFAULT);

    /* Read dataset */
    status = H5Dread(dataset_id, H5T_NATIVE_SHORT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_data[0][0]);

    /* Store two dimensional array at n-th position in data array */
    data[file_index] = &dset_data;

    /* Close the dataset. */
    status = H5Dclose(dataset_id);

    /* Close the file. */
    status = H5Fclose(file_id);
}

【问题讨论】:

  • 哇..一个三星级+阵列。恭喜你,你是winner
  • Three Star Programmer 不是一个褒义词。我不愿意花时间研究一系列三分球的目的——我的大脑被炸了。这几乎肯定是错误的。鉴于多个单独的内存分配,您无法在单个 read 函数调用中读取所有内容。您可能可以使用类似于 POSIX 的 readv() 的函数来完成此操作,但需要做很多设置工作。
  • 嗯...该代码实际上在哪里尝试使用声明为short ***data[line_count]data 变量?你只是想在开始之前吓跑所有人吗?
  • 仅供参考:H5 函数记录在 H5D*()H5F*()
  • 哦,好的;这就是为什么眼球不好而搜索更好的原因。您在 data[file_index] 条目中记录了局部变量 data_set 的地址。这不好。你需要弄清楚发生了什么。我认为你应该从data 中减去一颗星,并分配data[file_index] = dset_data;。并且没有太多其他需要改变的地方。您有一个 2D 数据集数组,而不是 3D 数据集数组。

标签: c hdf5


【解决方案1】:

将 cmets(减去对三星级数据的本能反应)转化为答案。

data的声明:

short ***data[line_count];

以及分配给它的行:

data[file_index] = &pset_data;

是麻烦的根源。您在每次迭代时都存储了一个局部变量的地址——同一个局部变量。这不是你想要的;您想存储您在pset_data 中保存的值,而不是存储该值的地址。

快速解决办法是失去data的一颗星:

short **data[line_count];

然后将赋值改为:

data[file_index] = pset_data;

这应该是此代码中需要的全部内容。使用data的代码需要做相应的调整。

如果你仔细想想,data 是一个二维数据集的数组;只需要数据的两颗星和数组的下标。考虑结构类型的数组可能是明智的,其中结构类型封装了一个数据集——它包含指向数据本身的指针,还可能包含大小信息,也许它会存储文件它来自或有关数据集的其他元数据。这将避免多星问题。当您拥有三颗星时,很难跟踪正在发生的事情。如果你真的有 N 维数据,那么声明中可能需要 N 个星,但辅助数据结构也变得越来越洛可可。但要避免三星级指针。如 cmets 中所述,Three-Star Programmer 不是一个互补的加词。偶尔——非常偶尔——这是必要的。这通常不是必需的,应尽可能避免。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2016-02-10
    • 2018-03-18
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2021-07-05
    相关资源
    最近更新 更多