【问题标题】:Errors using boost numeric bindings and lapack call to gesvd使用 boost 数字绑定和对 gesvd 的 lapack 调用时出错
【发布时间】:2015-02-21 05:56:40
【问题描述】:

我最近尽了最大的努力来设置 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 的实例化中::矩阵 >':
  • 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((boost::is_same

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

我使用的是 64 位 Windows,使用 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 的整体链接/编译过程的建议都将不胜感激。老实说,我在网上找不到任何好的例子。

【问题讨论】:

    标签: c++ boost lapack


    【解决方案1】:

    所以我发现了我的问题——有几个——我想我应该回答我自己的问题,这样其他人可能会受益。

    首先,我的 LAPACK 安装不正确。我下载的是 64 位版本而不是 32 位版本。尽管现在是 2015 年,但不知怎的,我还是被 32 位版本的 lapack dll 卡住了……

    其次,Eclipse 中的链接与我想象的有点不同。转到项目属性,C/C++ Build -> Settings -> Tool Settings -> MinGW C++ Linker -> Libraries 允许您链接库。在顶级库选项 (-l) 下,我添加了 lapack 和 blas。在底部库搜索路径 (-L) 下,我添加了 .dll 文件的位置。

    此时,我可以运行示例 LAPACK 代码,只是不使用 boost 数字绑定。第三,我弄清楚了数字绑定特征包括什么。从the traits overview page,我发现为了在绑定到 LAPACK 时使用特定的向量或矩阵类,我必须包含适当的特征特化。例如,使用boost::numeric::ublas::matrix 对象并将其发送到所需的LAPACK,包括特征头文件&lt;boost/numeric/bindings/traits/ublas_matrix.hpp&gt;

    这解决了您从原始帖子中看到的错误,我可以使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2018-08-07
      • 2020-06-19
      相关资源
      最近更新 更多