C++ 将boost::multi_数组写入hdf5数据集

C++ 将boost::multi_数组写入hdf5数据集,c++,boost,vector,hdf5,C++,Boost,Vector,Hdf5,是否有任何库或头可用于编写C++向量或Boo::多数组到HDF5数据集? 我已经看过了HDF5C++实例,他们只使用C++语法调用C函数,他们只将静态C数组写入它们的数据集(参见CREAT.CPP)。 我是不是没抓住要点 多谢各位, 亚当我不知道有什么。HDF5C++封装器不是那么好,特别是因为它们不允许与并行HDF5组合。所以,我在大约2小时内编写了自己的包装,效果很好。最后,你只需要直接调用它(或者间接地,如果你选择C++绑定)。p> 幸运的是,向量和多个数组在存储中都是连续的,因此您可以直

是否有任何库或头可用于编写C++向量或Boo::多数组到HDF5数据集?

我已经看过了HDF5C++实例,他们只使用C++语法调用C函数,他们只将静态C数组写入它们的数据集(参见CREAT.CPP)。 我是不是没抓住要点

多谢各位,
亚当

我不知道有什么。HDF5C++封装器不是那么好,特别是因为它们不允许与并行HDF5组合。所以,我在大约2小时内编写了自己的包装,效果很好。最后,你只需要直接调用它(或者间接地,如果你选择C++绑定)。p>
幸运的是,向量和多个数组在存储中都是连续的,因此您可以直接将数据从它们传递到HDF5函数调用中。

以下是如何以HDF5格式写入N维
多个数组
s

下面是一个简短的例子:

#include <boost/multi_array.hpp>
using boost::multi_array;
using boost::extents;


// allocate array
int NX = 5,  NY = 6,  NZ = 7;
multi_array<double, 3>  float_data(extents[NX][NY][NZ]);

// initialise the array
for (int ii = 0; ii != NX; ii++)
    for (int jj = 0; jj != NY; jj++)
        for (int kk = 0; kk != NZ; kk++)
            float_data[ii][jj][kk]  = ii + jj + kk;

// 
// write to HDF5 format
// 
H5::H5File file("SDS.h5", H5F_ACC_TRUNC);
write_hdf5(file, "doubleArray", float_data );
然后,我们可以使用一点模板转发魔法来创建一个正确类型的函数来输出数据。由于这是模板代码,如果要从程序中的多个源文件输出HDF5阵列,则需要将其保存在头文件中:

//!_______________________________________________________________________________________
//!     
//!     write_hdf5 multi_array
//!         
//!     \author leo Goodstadt (04 March 2013)
//!     
//!_______________________________________________________________________________________
template<typename T, std::size_t DIMENSIONS, typename hdf5_data_type>
void do_write_hdf5(H5::H5File file, const std::string& data_set_name, const boost::multi_array<T, DIMENSIONS>& data, hdf5_data_type& datatype)
{
    // Little endian for x86
    //FloatType datatype(get_hdf5_data_type<T>::type());
    datatype.setOrder(H5T_ORDER_LE);

    vector<hsize_t> dimensions(data.shape(), data.shape() + DIMENSIONS);
    H5::DataSpace dataspace(DIMENSIONS, dimensions.data());

    H5::DataSet dataset = file.createDataSet(data_set_name, datatype, dataspace);

    dataset.write(data.data(), datatype);
}

template<typename T, std::size_t DIMENSIONS>
void write_hdf5(H5::H5File file, const std::string& data_set_name, const boost::multi_array<T, DIMENSIONS>& data )
{

    get_hdf5_data_type<T> hdf_data_type;
    do_write_hdf5(file, data_set_name, data, hdf_data_type.type);
}
/_______________________________________________________________________________________
//!     
//!     写入hdf5多线程阵列
//!         
//!     \作者leo Goodstadt(2013年3月4日)
//!     
//!_______________________________________________________________________________________
模板
void do_write_hdf5(H5::H5文件,常量std::字符串和数据集名称,常量boost::多数组和数据,hdf5_数据类型和数据类型)
{
//x86的小端点
//FloatType数据类型(get_hdf5_data_type::type());
数据类型。设置顺序(H5T顺序);
向量维度(data.shape(),data.shape()+维度);
H5::数据空间数据空间(DIMENSIONS,DIMENSIONS.data());
H5::DataSet DataSet=file.createDataSet(数据集名称、数据类型、数据空间);
dataset.write(data.data(),数据类型);
}
模板
void write_hdf5(H5::H5文件文件、常量std::字符串和数据集名称、常量boost::多数组和数据)
{
获取_hdf5_data_type hdf_data_type;
写入hdf5(文件、数据集名称、数据、hdf数据类型.type);
}

你好,好的,谢谢你让我知道-那我就继续干吧!;-)您的意思是使用
模板结构get_hdf5_data_type{static H5::IntType(){return H5::PredType::NATIVE_CHAR;}?是的,是的,HDF5C++ API是可怕的。它非常接近底层C API,而不需要提供有用的C++接口。
//!_______________________________________________________________________________________
//!     
//!     write_hdf5 multi_array
//!         
//!     \author leo Goodstadt (04 March 2013)
//!     
//!_______________________________________________________________________________________
template<typename T, std::size_t DIMENSIONS, typename hdf5_data_type>
void do_write_hdf5(H5::H5File file, const std::string& data_set_name, const boost::multi_array<T, DIMENSIONS>& data, hdf5_data_type& datatype)
{
    // Little endian for x86
    //FloatType datatype(get_hdf5_data_type<T>::type());
    datatype.setOrder(H5T_ORDER_LE);

    vector<hsize_t> dimensions(data.shape(), data.shape() + DIMENSIONS);
    H5::DataSpace dataspace(DIMENSIONS, dimensions.data());

    H5::DataSet dataset = file.createDataSet(data_set_name, datatype, dataspace);

    dataset.write(data.data(), datatype);
}

template<typename T, std::size_t DIMENSIONS>
void write_hdf5(H5::H5File file, const std::string& data_set_name, const boost::multi_array<T, DIMENSIONS>& data )
{

    get_hdf5_data_type<T> hdf_data_type;
    do_write_hdf5(file, data_set_name, data, hdf_data_type.type);
}