这个问题可能听起来有点奇怪:我想使用 Boost 的 ublas 和 ATLAS/Lapack 进行数值矩阵计算。我正在使用Boost 数字绑定来连接这两个库。但是,要么我找不到它,要么没有关于如何使用这些绑定的适当文档。另外,我是 Boost 的新手(实际上是一般的 C++),所以我很难找出如何在我的代码中使用 Lapack 提供的函数。
我最终要解决的问题是找到对称带状矩阵的特征值和向量。据我了解,我将lapack::steqr
用于此。问题是,我不知道如何正确调用该函数。在数字绑定的代码中,我可以看到如下内容:
template <typename D, typename E, typename Z, typename W>
inline
int steqr( char compz, D& d, E& e, Z& z, W& work ) {
int const n = traits::vector_size (d);
assert( traits::vector_size (e) == n-1 );
assert( traits::matrix_size1 (z) == n );
assert( traits::matrix_size2 (z) == n );
assert( compz=='N' || compz=='V' || compz=='I' );
...
现在,我该如何处理?我尝试steqr<double, double, double, double>(...)
了双数组,但没有奏效。然后,为了找出要使用的正确参数,我选择了一个断言并试图找到任何可以使用的东西traits::matrix_size1(...)
——即使我无法编译,无论是使用双数组还是使用ublas::matrix
.
所以我的问题是,一般来说:当我发现这样一个没有完整文档的库时,我如何知道如何调用函数?我主要来自 C 语言,对所有这些模板感到非常困惑。真的是追踪代码中所有内容的唯一方法吗?还是有什么小技巧?或者我可以从错误消息中获取信息吗?
对于以下代码,此类错误消息的一个示例是:
ublas::matrix<double> empty(N,N);
std::cout << traits::matrix_size1<ublas::matrix>(empty) << std::endl;
然后我在编译期间得到:
eigenvalues.cpp:40:85: error: no matching function for call to ‘matrix_size1(boost::numeric::ublas::matrix<double, boost::numeric::ublas::basic_row_major<>, boost::numeric::ublas::unbounded_array<double, std::allocator<double> > >&)’
eigenvalues.cpp:40:85: note: candidate is:
/usr/include/boost/numeric/bindings/traits/matrix_traits.hpp:148:18: note: template<class M> std::ptrdiff_t boost::numeric::bindings::traits::matrix_size1(M&)
候选人列在那里可能很有用,但我只是不知道如何阅读这一行并相应地调整我的代码。
再说一遍:这个问题有点笼统,关于如何处理这样的事情。我知道类和模板的基本概念,但这对我的知识来说有点太抽象了。