使用boost数字绑定和lapack调用gesvd的错误

时间:2015-02-21 05:56:40

标签: c++ boost lapack

我最近努力设置boost的数字绑定以允许我使用C ++中的LAPACK,但我遇到了一些障碍。首先,我已经确认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&gt;':
  • C:\ MinGW \ boost \ boost_1_57_0 / boost / numeric / bindings / traits / matrix_traits.hpp:48:10:'struct boost :: numeric :: bindings :: traits :: matrix_traits&gt;'
  • 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&amp;,VecS&amp;,MatrU&amp;,MatrV&amp;)'
  • C:\ MinGW \ boost \ boost_1_57_0 / boost / numeric / bindings / lapack / gesvd.hpp:477:50:从'int boost :: numeric :: bindings :: lapack :: gesvd(char,char, MatrA&amp;,VecS&amp;,MatrU&amp;,MatrV&amp;)'
  • .. \ 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&LT;

同样,我已经测试了提升和ublas本身工作正常。当我注释掉lapack::gesvd代码行时,所有内容都会编译并运行正常。据我所知,这些错误意味着我已经正确地将LAPACK链接到程序(没有未解析的符号),并且我的程序能够找到正确的绑定文件(调用lapack::gesvd时返回不同的错误你给它不正确的输入)。所以我很茫然。

我使用的是Eclipse 64位,使用Eclipse,C ++,boost,ublas和LAPACK。有关LAPACK的boost数字绑定的信息,请访问:http://git.tiker.net/boost-numeric-bindings.git/blob_plain/be4a548307f3e95786acb3487e571bdffe738e4a:/libs/numeric/bindings/lapack/doc/index.html

有关使用boost数字绑定+ LAPACK的整体链接/编译过程的任何建议将不胜感激。老实说,我无法在网上找到任何好的例子。

1 个答案:

答案 0 :(得分:1)

所以我想出了我的问题 - 有几个, - 我想我应该回答我自己的问题,以便其他人可能受益。

首先,我的LAPACK安装不正确。我下载了64位版本而不是32位版本。即使是在2015年,不知怎的,我仍然坚持使用32位版本的lapack dll ...

其次,Eclipse中的链接与我想象的有些不同。转到项目属性,C / C ++ Build - &gt;设置 - &gt;工具设置 - &gt; MinGW C ++ Linker - &gt;库允许您链接库。在顶级库选项(-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;
}