Ошибки при использовании числовых привязок boost и вызова lapack для gesvd

Недавно я приложил все усилия, чтобы настроить числовые привязки boost, чтобы позволить мне использовать LAPACK из C++, но я столкнулся с некоторыми препятствиями. Прежде всего, я подтвердил, что boost работает нормально, так что это связано с моими библиотеками LAPACK или числовыми привязками boost.

Вот немного кода, чтобы проверить, что я пытаюсь сделать:

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/bindings/lapack/gesvd.hpp>
#include <boost/numeric/bindings/traits/ublas_matrix.hpp>
//#include <boost/numeric/bindings/traits/ublas_vector2.hpp>
//#include <boost/numeric/bindings/traits/matrix_traits.hpp>

typedef boost::numeric::ublas::matrix<int> iMatrix;
typedef boost::numeric::ublas::matrix<double> dMatrix;
typedef boost::numeric::ublas::vector<int> iVector;
typedef boost::numeric::ublas::vector<double> dVector;
namespace ublas = boost::numeric::ublas;
namespace lapack = boost::numeric::bindings::lapack;

void function() {
    int n = 10;
    dMatrix jacobi(n,n); // then actually initialize it
    dVector eigenvals(n);
    dMatrix eigenvects(n);
    dVector work(n);

    int error = lapack::gesvd('N', 'A', jacobi, eigenvals, eigenvects, work);

    std::cout << eigenvals << std::endl;
}

Теперь, хотя я не на 100% уверен, что этот код должен компилироваться, когда все настроено правильно, ошибки, которые я получал при сборке, не имеют для меня особого смысла.

  • В файле, включенном в C:\MinGW\boost\boost_1_57_0/boost/serialization/tracking.hpp:20:0,
  • В файле, включенном в C:\MinGW\boost\boost_1_57_0/boost/serialization/tracking.hpp:20:0,
  • .............
  • из.. \ Solver.cpp: 6:
  • C: \ MinGW \ boost \ boost_1_57_0 / boost / numeric / bindings / traits / ublas_matrix.hpp: в экземпляре 'struct boost:: numeric:: bindings:: traits:: matrix_detail_traits, boost:: numeric:: ublas:: matrix > ':
  • C: \ MinGW \ boost \ boost_1_57_0 / boost / numeric / bindings / traits / matrix_traits.hpp: 48: 10: требуется из 'struct boost:: numeric:: bindings:: traits:: matrix_traits>'
  • C: \ MinGW \ boost \ boost_1_57_0 / boost / numeric / bindings / lapack / gesvd.hpp: 167: 7: требуется от 'int boost:: numeric:: bindings:: lapack:: gesvd (char, char, char, MatrA &, VecS &, MatrU &, MatrV &) '
  • C: \ MinGW \ boost \ boost_1_57_0 / boost / numeric / bindings / lapack / gesvd.hpp: 477: 50: требуется от 'int boost:: numeric:: bindings:: lapack:: gesvd (char, char, MatrA &, VecS &, MatrU &, MatrV &) '
  • .. \ Solver.cpp: 85: 77: требуется отсюда
  • C:\MinGW\boost\boost_1_57_0/boost/numeric/bindings/traits/ublas_matrix.hpp:46:5: ошибка: неверное применение 'sizeof' к неполному типу 'boost:: STATIC_ASSERTION_FAILURE'
  • BOOST_STATIC_ASSERT ((повышение::is_same<

Опять же, я проверил, что boost и ublas сами по себе работают нормально. Когда я закомментирую lapack::gesvd строка кода, все компилируется и работает нормально. Насколько я могу судить, эти ошибки означают, что я правильно связал LAPACK с программой (нет неразрешенных символов), и моя программа может найти правильные файлы привязки (вызов lapack::gesvd возвращает другую ошибку, если вы введете неверный ввод). Так что я в растерянности.

Я работаю на 64-битной Windows, использую Eclipse, C++, boost, ublas и LAPACK. Информацию о повышенных числовых привязках к LAPACK можно найти здесь: http://git.tiker.net/boost-numeric-bindings.git/blob_plain/be4a548307f3e95786acb3487e571bdffe738e4a:/libs/numeric/bindings/lapack/doc/index.html

Будем благодарны за любые советы по поводу общего процесса компоновки / компиляции с использованием форсированных числовых привязок +LAPACK. Честно говоря, я не смог найти хороших примеров в Интернете.

1 ответ

Решение

Итак, я выяснил свои проблемы (их было несколько), и я подумал, что должен ответить на свой вопрос, чтобы другие могли выиграть.

Прежде всего, моя установка LAPACK была неправильной. Я скачал 64-битную версию вместо 32-битной версии. Несмотря на то, что сейчас 2015 год, я как-то застрял, используя 32-битную версию DLL Lapack...

Во-вторых, ссылки в Eclipse работают немного иначе, чем я думал. Переходя к свойствам проекта, C/C++ Build -> Настройки -> Настройки инструмента -> MinGW C++ Linker -> Библиотеки позволяет связывать библиотеки. Под опцией верхних библиотек (-l) я добавил lapack и blas. В нижней части пути поиска библиотеки (-L) я добавил расположение DLL-файлов.

К этому моменту я мог запустить пример кода LAPACK, но не использовать расширенные числовые привязки. В-третьих, я выяснил, что включает в себя черты числовых привязок. На странице обзора признаков я смог выяснить, что для использования определенного векторного или матричного класса в привязках к LAPACK мне пришлось включить соответствующую специализацию признаков. Например, используя boost::numeric::ublas::matrix необходим объект и отправка его в LAPACK, включая заголовочный файл <boost/numeric/bindings/traits/ublas_matrix.hpp>,

Это решило мою ошибку, которую вы видите из исходного поста, и я мог бы использовать усиление числовых привязок. Наконец, я испортил мой пример кода, потому что я на самом деле не понимал, что gesvd делал. Это была просто тестовая программа, так что это не страшно, но я приложу рабочий код ниже, чтобы показать разложение по единственному значению, которое я первоначально пытался выполнить.

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

#include <boost/numeric/bindings/lapack/gesvd.hpp>

#include <boost/numeric/bindings/traits/ublas_matrix.hpp>
#include <boost/numeric/bindings/traits/ublas_vector.hpp>
#include <boost/numeric/bindings/traits/ublas_vector2.hpp>

typedef boost::numeric::ublas::matrix<int> iMatrix;
typedef boost::numeric::ublas::matrix<double> dMatrix;
typedef boost::numeric::ublas::vector<int> iVector;
typedef boost::numeric::ublas::vector<double> dVector;
namespace ublas = boost::numeric::ublas;
namespace lapack = boost::numeric::bindings::lapack;

void function() {
    int n = 10;
    dMatrix jacobi(n,n); // then actually initialize it
    dVector eigenvals(n);

    //int error = lapack::gesvd('S','S', jacobi, eigenvals, eigenvects1, eigenvects2);
    int error = lapack::syevd('V','L', jacobi, eigenvals, lapack::optimal_workspace() );

    std::cout << eigenvals << std::endl;
    std::cout << jacobi << std::endl;
}
Другие вопросы по тегам