C++读取HDF5文件

2023-11-12

我将博客迁到 GitHub pages 了。本文有些纰漏,请前往 pages 查看。


概述

HDF5是一种跨平台存储(高维)数组的数据格式。HDF5有多种语言的绑定,其中包括C++。在这里我记录了各种踩坑后如何将数据读入C++。

读标量

// 注意头文件不是 hdf5.h
#include "H5Cpp.h"
//#include <iostream>
int main()
{
    H5::H5File file("/path/to/data.h5", H5F_ACC_RDONLY);
    H5::DataSet dataset = file.openDataSet("dataset/path");
    H5::DataSpace filespace = dataset.getSpace();
    hsize_t shape[1];  // 此处不确定,不过长度设为 1 肯定是足够了
    int _dims = filespace.getSimpleExtentDims(shape); // _dims 一定为 0
    double buf[1];
    dataset.read(buf, H5::PredType:NATIVE_DOUBLE, mspace, filespace);
    // 读出来啦
    //std::cout << buf[0] << std::endl;
    return 0;

    // file 和 dataset 会被它们的析构函数关闭
}

读向量到数组

#include "H5Cpp.h"
//#include <iostream>
int main()
{
    H5::H5File file("/path/to/data.h5", H5F_ACC_RDONLY);
    H5::DataSet dataset = file.openDataSet("dataset/path");
    H5::DataSpace filespace = dataset.getSpace();
    hsize_t shape[1];  // `1' 应被替换成相应维数,例如矩阵应写作 `2'
    // 返回的 _dim 是实际维数,如果你没记错的话应该和上一行填的相同
    int _dims = filespace.getSimpleExtentDims(shape);
    // 现在 shape 的前 _dim 个元素是向量形状了
    double *buf = new double[shape[0]];  // 如果是矩阵的话应分配 shape[0]*shape[1] 的空间
    dataset.read(buf, H5::PredType::NATIVE_DOUBLE, mspace, filespace);
    // 读出来啦
    // for 循环打印 buf,此处略过

    delete[] buf;
    return 0;
}

注意向量是连续存储的,不能用例如 double cbuf[M][N] 二维数组去读例如矩阵。见此回答

读向量到 std::vector

基本相同:

#include "H5Cpp.h"
#include <vector>
//#include <iostream>
int main()
{
    H5::H5File file("/path/to/data.h5", H5F_ACC_RDONLY);
    H5::DataSet dataset = file.openDataSet("dataset/path");
    H5::DataSpace filespace = dataset.getSpace();
    hsize_t shape[1];  // `1' 应被替换成相应维数,例如矩阵应写作 `2'
    // 返回的 _dim 是实际维数,如果你没记错的话应该和上一行填的相同
    int _dims = filespace.getSimpleExtentDims(shape);
    // 现在 shape 的前 _dim 个元素是向量形状了
    std::vector<double> buf(shape[0]);  // 如果是矩阵的话应分配 shape[0]*shape[1] 的空间
    dataset.read(buf.data(), H5::PredType::NATIVE_DOUBLE, mspace, filespace);
    // 读出来啦
    // for 循环打印 buf,此处略过

    return 0;
}

编译选项

此处只涉及 Linux/Darwin 的选项,不是很清楚 Windows 怎么编译。Makefile 如下:

LDFLAGS = \
	-L/path/to/hdf5/incstall/directory/lib
# 注意这里链接库的名称,不是光一个 -lhdf5 就行了的
LDLIBS = \
	-lhdf5 \
	-lhdf5_cpp \
	-lhdf5_hl_cpp
CPPFLAGS = \
	-I/path/to/hdf5/install/directory/include
CXX = clang++

# `-std=c++11' 应该是可选的,不过我的运行环境如此,没试过不加会怎样
a.out : source.cpp
	$(CXX) $(CPPFLAGS) $(LDFLAGS) -std=c++11 -o $@ $^ $(LDLIBS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++读取HDF5文件 的相关文章

随机推荐

  • 记录一次iPhone5s的iCloud bypass经历

    之前成功过一次 使用的是checkra1n v0 9 5 越狱成功后 使用ssh连接手机 执行以下几个命令 正在挂载根目录文件系统为读写 bash 3 2 mount o rw union update bash 3 2 echo gt g
  • C语言:选择+编程(每日一练Day3)

    目录 选择题 题一 题二 题三 题四 题五 编程题 题一 记负均正 思路一 题二 旋转数组的最小数字 思路一 选择题 题一 1 已知函数的原型是 int fun char b 10 int a 设定义 char c 10 int d 正确的
  • Centos7部署MySQL主从复制

    一 准备 1 准备两台服务器 如果本地测试 准备两台虚拟机 2 两台服务器上安装相同的mysql数据库 3 我这里准备两台虚拟机演示 192 168 21 102 主机 192 168 21 105 从机 4 在两台mysql数据库分别创建
  • 计算机视觉理论笔记 (5) - 边缘检测 (Edge Detection)

    边缘检测 Edge Detection 总览 边缘 edges 基于梯度 gradient 的边缘检测 检测不连续性 detection of discontinuities 1D 2D 梯度强度阈值 threshold 噪声影响 其他算子
  • QT学习三之多界面跳转与对话框

    以下内容均是个人理解 不保证都是正确的 如有错欢迎指正 欢迎学习交流 815030927 qq com 一 多界面跳转 1 介绍 MVC框架 MVC是模型 model 视图 view controller 控制器 的缩写 模型视图控制器是一
  • Java面试常见问题:Mybatis的工作原理

    ORM框架是几乎所有Java应用都会用到的技术 大多数ORM框架都是将Java对象与数据表进行关联 Mybatis则是将Java方法和SQL语句进行了映射 Mapping 这样不仅简化了ORM操作 同时也支持数据表关联查询 视图查询 存储过
  • MySQL-case语句

    btype 1 奖金是薪水的0 1倍 btype 2 奖金是薪水的0 2倍 其他情况奖金是薪水的0 3倍 case btype when 1 then salary 0 1 when 2 then salary 0 2 else salar
  • 机器学习——数据清洗与特征选择

    一 数据清洗 数据清洗 data cleaning 是在机器学习过程中一个不可缺少的环节 其数据的清洗结果直接关系到模型效果以及最终的结论 在实际的工作中 数据清洗通常占开发过程的50 80 左右的时间
  • python 运用 flask框架分页

    k Model query filter by id 0 paginage 1 2 items k Model query filter id gt 0 paginate 1 2 items for i in k print i
  • 维度建模之缓慢渐变维

    维度建模之缓慢渐变维 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中 特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题 业务数据库中的一些数据发生了更改 到底要不要将这些变化也反映到数据仓库中 在数据仓库中 哪些数据应
  • STM32 串口接收中断 代码

    1 代码介绍 今天做项目 要用到串口中断接收 在网上一搜 大量代码 copy过来编译没问题 但是运行起来才发现不能产生中断 于是决定自己搞搞 用了半天的功夫 终于有结果了 2 共同讨论 代码属个人编写 自有不足之处 望大家指出 3 单片机型
  • 代码走查1

    线上问 和研发一起简单的从代码层面去解决问题 略low 代码走查 1 存在的问题 SQL查询 1 对于业务上没有用的字段没必要添加 比如 IsDel 在具体的业务上 删除数据是直接硬删除 直接删除了物理数据 所以 在SQL查询的时候 SQL
  • 数据分析之航空公司客户价值分析

    航空公司客户价值分析 1 挖掘背景与目标 开启了第一个数据分析的项目 针对于航空公司价值的分析 客户关系管理的关键问题是客户分类 通过客户分类 区别无价值客户 高价值客户 企业针对不同价值的客户制定优化的个性化服务方案 采取不同的营销策略
  • c语言嵌入arm指令如何编译,ARM汇编语言与嵌入式C语言混合编程————内嵌汇编.pdf...

    ARM汇编语言与嵌入式C语言混合编程 内嵌汇编 ARM C 汇编语言与嵌入式 语言混合编程 内嵌汇编 在嵌入式程序设计中 有些场合 如对具体的硬件资源进行访问 必须用汇编语言来实 C C 现 可以采用在嵌入式 语言程序中嵌入汇编语言或嵌入式
  • 可以学学Golang、(Go的优势及适合做什么

    1 关键字少 运维简单 2 原生支持高并发 GOROUTINE 协程 进程是资源分配的最小单位 线程是CPU调度的最小单位 一个线程可以有上千个协程 不是在CPU层面去调度的 是在用户空间用Golang的一个调度器去调度不同的协程 由于协程
  • 计算机基础一:IP地址与域名解析

    一 Free IP Scanner 1 是免费的局域网IP地址扫描软件 它简单地Ping每个IP地址以检查它是否还活着 2 可以扫描出某一个局域网中所有的ip地址 正在用的IP地址和没有使用的ip地址 3 可以扫描对应的网卡MAC地址 计算
  • python日常实用技能:如何用Python将图片批量从png格式转换至WebP格式

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 最近因为工作需要去研究了下png的压缩 发现转换成webp格式可以小很多 下面给大家分享利用Python将图片批量从png格式转换至WebP格式的方法 下面来一起看看 实现
  • 远程部署java web项目_JavaWeb项目的部署以及远程调试

    Linux环境下软件的安装 Linux环境下的程序的安装 更新 卸载和查看 rpm 命令 相当于windows程序的添加 卸载程序 进程程序的安装 查看 卸载 本地程序安装 rpm ivh 程序名 本地程序查看 rpm qa 本地程序卸载
  • 4分钟插入1000万条数据到mysql数据库表

    准备工作 我用到的数据库为 mysql数据库8 0版本的 使用的InnoDB存储引 创建测试表 CREATE TABLE product id int NOT NULL AUTO INCREMENT name varchar 100 DEF
  • C++读取HDF5文件

    我将博客迁到 GitHub pages 了 本文有些纰漏 请前往 pages 查看 概述 HDF5是一种跨平台存储 高维 数组的数据格式 HDF5有多种语言的绑定 其中包括C 在这里我记录了各种踩坑后如何将数据读入C 读标量 注意头文件不是