2015-02-21 3 views
0

Недавно я сделал все возможное, чтобы настроить числовые привязки boost, чтобы позволить мне использовать LAPACK с C++, но я столкнулся с некоторыми препятствиями. Во-первых, я подтвердил, что boost работает нормально, поэтому это связано с моими библиотеками LAPACK или с числовыми привязками boost.Ошибки с использованием форсированных числовых привязок и вызова lapack для 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_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_1_57_0/повышающего/сериализации/tracking.hpp: 20: 0,
  • В файле включен в C: \ MinGW \ импульс \ boost_1_57_0/повышающей/сериализаций /tracking.hpp:20:0,
  • .............
  • из .. \ Solver.cpp: 6:
  • C: \ MinGW \ импульс \ 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 &, ЗВТ & Матру &, MatrV &) '
  • C: \ MinGW \ импульс \ boost_1_57_0/повышающего/цифровой/привязок/LaPack/gesvd.hpp: 477: 50: требуется от ВНУТР повышения :: числовыми :: привязок: : 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»неполного типа 'повышение :: STATIC_ASSERTION_FAILURE'
  • BOOST_STATIC_ASSERT ((повышение :: is_same <

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

Я нахожусь в Windows 64 бит, используя 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-битную версию lapack dll ...

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

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

Это решило мою ошибку, которую вы видите из исходного сообщения, и я мог бы использовать числовые привязки boost. Наконец, я испортил свой примерный код, потому что я действительно не понял, что делал 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; 
}