使用 boost 数字绑定和 lapack 调用 gesvd 时出错
Errors using boost numeric bindings and lapack call to gesvd
我最近尽了最大努力来设置 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 >':
的实例化中
- 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
returns当你给它不正确的输入时会出现不同的错误)。所以我很茫然。
我在 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
任何关于使用 boost numeric bindings+LAPACK 的整个 linking/compiling 过程的建议都将不胜感激。老实说,我在网上找不到任何好的例子。
所以我弄清楚了我的问题——有几个问题——我想我应该回答我自己的问题,这样其他人可能会受益。
首先,我的LAPACK 安装不正确。我下载的是 64 位版本而不是 32 位版本。尽管现在是 2015 年,但不知何故,我仍然无法使用 32 位版本的 lapack dll...
其次,link在 Eclipse 中的工作方式与我想象的略有不同。转到项目属性,C/C++ Build -> Settings -> Tool Settings -> MinGW C++ Linker -> Libraries 允许您 link 库。在顶级库选项 (-l) 下,我添加了 lapack 和 blas。在底部库搜索路径 (-L) 下,我添加了 .dll 文件的位置。
此时,我可以 运行 采样 LAPACK 代码,只是不使用 boost 数字绑定。第三,我弄清楚了数字绑定特征包括什么。从 the traits overview page,我能够弄清楚,为了在 LAPACK 的绑定中使用特定的向量或矩阵 class,我必须包括适当的特征专业化。例如,使用 boost::numeric::ublas::matrix
对象并将其发送到 LAPACK 需要包含特征头文件 <boost/numeric/bindings/traits/ublas_matrix.hpp>
.
这解决了您从原始 post 中看到的我的错误,并且我可以使用 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;
}
我最近尽了最大努力来设置 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 >': 的实例化中
- 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
returns当你给它不正确的输入时会出现不同的错误)。所以我很茫然。
我在 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
任何关于使用 boost numeric bindings+LAPACK 的整个 linking/compiling 过程的建议都将不胜感激。老实说,我在网上找不到任何好的例子。
所以我弄清楚了我的问题——有几个问题——我想我应该回答我自己的问题,这样其他人可能会受益。
首先,我的LAPACK 安装不正确。我下载的是 64 位版本而不是 32 位版本。尽管现在是 2015 年,但不知何故,我仍然无法使用 32 位版本的 lapack dll...
其次,link在 Eclipse 中的工作方式与我想象的略有不同。转到项目属性,C/C++ Build -> Settings -> Tool Settings -> MinGW C++ Linker -> Libraries 允许您 link 库。在顶级库选项 (-l) 下,我添加了 lapack 和 blas。在底部库搜索路径 (-L) 下,我添加了 .dll 文件的位置。
此时,我可以 运行 采样 LAPACK 代码,只是不使用 boost 数字绑定。第三,我弄清楚了数字绑定特征包括什么。从 the traits overview page,我能够弄清楚,为了在 LAPACK 的绑定中使用特定的向量或矩阵 class,我必须包括适当的特征专业化。例如,使用 boost::numeric::ublas::matrix
对象并将其发送到 LAPACK 需要包含特征头文件 <boost/numeric/bindings/traits/ublas_matrix.hpp>
.
这解决了您从原始 post 中看到的我的错误,并且我可以使用 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;
}