C ++:Armadillo不想与hdf5格式合作

时间:2018-08-09 19:52:34

标签: c++ hdf5 armadillo

最近,我决定将数据存储到hdf5二进制文件中,而不是ASCII文件中。我想使用hdf5格式。基本上,思想是将标头和数据放在同一文件中(标头ASCII不是二进制格式,然后是二进制格式)。像这样:

----------------------------------------
Dataname : testdata
ref_ell  : wgs84
bmin     : 
etc.

这是hdf5格式的数据


犰狳库(http://arma.sourceforge.net/docs.html#save_load_mat)确实具有将数据附加到现有文件(hdf5_opts :: append)的功能。但是我早就解决了这个问题。我遵循了手册,但显然我做错了。可以说我有:

#include <iomanip>
#include <iostream>
#include <fstream>
#include <map>
#include <cmath>
#include <algorithm>
#include <vector>
#define ARMA_USE_HDF5
#include <hdf5.h>
#include <armadillo>


// g++ -O3 -lhdf5 -larmadillo -DARMA_DONT_USE_WRAPPER -DARMA_USE_BLAS -DARMA_USE_LAPACK -DARMA_USE_HDF5 - hdf5.cpp -o hdf5.o
// g++ -O3 -lhdf5 -larmadillo hdf5.cpp -o hdf5.o
// g++ -O3 -larmadillo -lhdf5 hdf5.cpp -o hdf5.o


using namespace std;

int main() {

    arma::mat amat = arma::randu<arma::mat>(5,6);

    cout << amat << endl;


    amat.save( arma::hdf5_name("A.h5", "my_data"));

    arma::mat bmat;
    bool t = bmat.load( arma::hdf5_name("A.h5", "my_data"));

    cout << bmat << endl;

    if(t == false)
        cout << "problem with loading" << endl;

    return 0;
}

我尝试编译此练习,但只有错误:

要么:

hdf5.cpp: In function ‘int main()’:
hdf5.cpp:28:43: error: ‘hdf5_name’ was not declared in this scope
     amat.save( hdf5_name("A.h5", "my_data"));

或者:

g++ -O3 -lhdf5 -larmadillo hdf5.cpp -o hdf5.o
hdf5.cpp: In function ‘int main()’:
hdf5.cpp:27:16: error: ‘hdf5_name’ is not a member of ‘arma’
     amat.save( arma::hdf5_name("A.h5", "my_data"), arma::hdf5_binary);

我想念什么? (已解决-需要更新犰狳库!

继续到问题的第二部分:首先保存标头,然后以hdf5格式添加数据。这样工作。但是标头是在矩阵存储后添加的。

#include <iomanip>
#include <iostream>
#include <fstream>
#include <map>
#include <cmath>
#include <algorithm>
#include <vector>


#define ARMA_USE_HDF5
#define ARMA_DONT_USE_WRAPPER
#include <hdf5.h>
#include <armadillo>

// g++ -O3 -larmadillo -lhdf5 hdf5.cpp -o hdf5.o

using namespace std;

int main() {

    arma::mat amat = arma::randu<arma::mat>(5,6);

    cout << amat << endl;

    amat.save( arma::hdf5_name("A.hdf5", "gmodel", arma::hdf5_opts::append ) );
    ofstream f_out; f_out.open( "A.hdf5", ios::app );

    f_out << "\nbegin_of_head ================================================\n";
    f_out << "model name : " << "model_name" << endl;
    f_out << "model type : " << "model_type" << endl;
    f_out << "units      : " << "units" << endl;
    f_out << "ref_ell    : " << "ref_ell" << endl;
    f_out << "ISG format = " << "isg_format" << endl;;
    f_out << "end_of_head ==================================================\n";
    f_out.close();

    return 0;
}

当我切换顺序时,amat.save()函数只会重写A.hdf5文件的内容。

1 个答案:

答案 0 :(得分:0)

对我来说,代码在

中有效(在Ubuntu 17.10中)
 g++ hdf5.cpp `pkg-config --cflags --libs hdf5`  -DARMA_DONT_USE_WRAPPER -I/home/claes/armadillo-8.500/include -o hdf5.o -lblas -llapack

其中

`pkg-config --cflags --libs hdf5`

扩展到

-I/usr/include/hdf5/serial -L/usr/lib/x86_64-linux-gnu/hdf5/serial -lhdf5