首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用C++应用编程接口在HDF5文件中写入/读取交错数组?

如何使用C++应用编程接口在HDF5文件中写入/读取交错数组?
EN

Stack Overflow用户
提问于 2020-03-03 22:07:56
回答 1查看 280关注 0票数 1

我有多个不同大小的包含浮点数的std::vector。我想在HDF5文件中以锯齿数组的形式将它们全部写入/读取(理想情况下,使用hyperslabs逐个写入/读取它们,因为我不能同时在内存中保存所有向量)。我认为我应该使用一个规则数组,它的每个元素都是可变长度的数据类型,但我找到的所有示例都是C示例。我的代码如下所示:

代码语言:javascript
运行
复制
#include <vector>
#include "H5Cpp.h"

int main() {
  std::vector<float> v1 {0.1, 0.2, 0.3};
  std::vector<float> v2 {0.4, 0.5};

  H5::VarLenType array_type (H5::PredType::NATIVE_FLOAT);

  hsize_t dimensions[1] = {2};
  H5::DataSpace dataspace (1, dimensions);

  H5::H5File file ("jarray.h5", H5F_ACC_TRUNC);
  H5::DataSet dataset = file.createDataSet("jarray", array_type, dataspace);

  hsize_t size[1] = {1};
  hsize_t offset[1] = {0};
  dataspace.selectHyperslab(H5S_SELECT_SET, size, offset);

  dataset.write(v1.data(), array_type);

  return 0;
};

如果我省略了对write函数的调用,代码将创建一个具有以下结构(由h5dump打印出来)的空文件:

代码语言:javascript
运行
复制
HDF5 "jarray.h5" {
GROUP "/" {
   DATASET "jarray" {
      DATATYPE  H5T_VLEN { H5T_IEEE_F32LE}
      DATASPACE  SIMPLE { ( 2 ) / ( 2 ) }
      DATA {
      (0): (), ()
      }
   }
}
}

这让我相信数据集具有正确的结构,但我没有正确编写部分。

有人能解释一下如何写入这样的数组吗?之后如何读取值呢?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-04 02:10:28

不确定如何使用HDF5 C++ API完成此操作,但您可以尝试使用HDFql,因为它可以减少HDF5的低级细节。在C++中使用HDFql,您可以执行以下操作来写入/读取HDF5交错数组:

代码语言:javascript
运行
复制
// create HDF5 file 'jarray.h5' and use (i.e. open) it
HDFql::execute("CREATE AND USE FILE jarray.h5");

// create HDF5 dataset 'jarray' of one dimension (size 2) as a variable-length float (i.e. jagged)
HDFql::execute("CREATE DATASET jarray AS VARFLOAT(2)");

// write 0.1, 0.2 and 0.3 in first row of dataset 'jarray', 0.4 and 0.5 in second row
HDFql::execute("INSERT INTO jarray VALUES((0.1, 0.2, 0.3), (0.4, 0.5))");

// read first row of dataset 'jarray' using an hyperslab and populate cursor with values
HDFql::execute("SELECT FROM jarray(0:::1)");

// display values of first row
while (HDFql::cursorNext() == HDFql::SUCCESS)
{
     std::cout << *HDFql::cursorGetFloat() << std::endl;
}

// read second row of dataset 'jarray' using an hyperslab and populate cursor with values
HDFql::execute("SELECT FROM jarray(1:::1)");

// display values of second row
while (HDFql::cursorNext() == HDFql::SUCCESS)
{
     std::cout << *HDFql::cursorGetFloat() << std::endl;
}

这是一个基于直接写入值的简短示例。如果您需要使用用户自定义内存(即变量)进行写/读,请查看reference manualexamples以获取更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60509028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档