C ++: Armadillo не хочет сотрудничать с форматом hdf5

Недавно я решил хранить свои данные в двоичном формате hdf5 вместо файлов ASCII. Я хотел бы использовать формат hdf5. В основном идея состоит в том, чтобы заголовок и данные были в одном файле (заголовок ASCII не двоичный формат, а затем двоичный формат). Что-то вроде этого:

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

а вот данные в формате hdf5


Библиотека Armadillo (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"));

Or:

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.


person Buddy    schedule 09.08.2018    source источник
comment
Похоже, вы используете действительно старую версию Armadillo. Согласно списку дополнений вам необходимо использовать как минимум версию 8.300 для необходимого hdf5. функциональность.   -  person hbrerkere    schedule 10.08.2018
comment
Да, вы были правы, я обновил свою федору с 26 до 28. И теперь она работает. Итак, мы можем перейти к другой части проблемы.   -  person Buddy    schedule 12.08.2018


Ответы (1)


Для меня код работал (в 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
person Claes Rolen    schedule 09.08.2018
comment
Сейчас я использую Fedora 26. Armadillo теперь стандартен в репозиториях. Но даже с вашей помощью: g ++ hdf5.cpp pkg-config --cflags --libs hdf5 -DARMA_DONT_USE_WRAPPER -I / home / claes / armadillo-8.500 / include -o hdf5.o -lblas -llapack - person Buddy; 10.08.2018
comment
Я думаю, вы можете попробовать: g ++ hdf5.cpp pkg-config --cflags --libs hdf5 -larmadillo -o hdf5.o, если вы хотите использовать предварительно скомпилированный Armadillo - person Claes Rolen; 10.08.2018