Ошибки при использовании числовых привязок 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;
}