Armadillo:在一个hdf5文件中保存多个数据集

时间:2017-10-06 11:24:05

标签: c++ hdf5 armadillo

我正在尝试使用armadillo的新功能将多个数据集保存到单个hdf5文件中,以便为数据集提供自定义名称(使用armadillo版本8.100.1)。 但是,只有最后保存的数据集才会在文件中结束。有没有办法用armadillo附加到现有的hdf5文件而不是替换它?

这是我的示例代码:

#define ARMA_USE_HDF5
#include <armadillo>

int main(){
    arma::mat A(2,2, arma::fill::randu);
    arma::mat B(3,3, arma::fill::eye);
    A.save(arma::hdf5_name("multi-hdf5.mat", "dataset1"), arma::hdf5_binary);
    B.save(arma::hdf5_name("multi-hdf5.mat", "dataset2"), arma::hdf5_binary);
    return 0;
}

使用h5dump实用程序读取hdf5文件。

2 个答案:

答案 0 :(得分:1)

不幸的是,我认为你不能这样做。我是一名HDF5开发人员,而不是犰狳开发人员,但我看了他们的来源。

保存功能看起来像是用于将单个矩阵转储到单个文件中。在函数save_hdf5_binary()(一个版本的diskio_meat.hpp:1255)中,他们使用H5F_ACC_TRUNC标志调用H5Fcreate(),这将破坏任何现有文件。如果文件存在,则不会打开&#39;或clobber / non-clobber选项。唯一的H5Fopen()调用是在hdf5_binary_load()函数中,那些不会保持文件打开以供以后写入。

这种情况就是你的情况,btw。 A.save()创建一个包含dataset1的文件,然后使用包含dataset2的新文件的B.save()clobbers文件。

另外,为了它的价值,&#39;附加到HDF5文件&#39;这不是考虑这个问题的正确方法。 HDF5文件不是像文本文件那样的字节/字符流。附加到数据集,是的。文件,没有。可以把它想象成一个关系数据库:您可以将数据附加到表中,但您可能不会说您要将数据附加到数据库。

答案 1 :(得分:1)

最新版本的Armadillo已经涵盖了这种可能性。 您必须在保存方法中使用hdf5_opts::append,以便保存 矩阵A然后你可以写 A.save(hdf5_name(filename, dataset, hdf5_opts::append) )