2

这个问题可能听起来有点奇怪:我想使用 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&)

候选人列在那里可能很有用,但我只是不知道如何阅读这一行并相应地调整我的代码。

再说一遍:这个问题有点笼统,关于如何处理这样的事情。我知道类和模板的基本概念,但这对我的知识来说有点太抽象了。

4

1 回答 1

1

由于我不太精通模板化 c++,我个人发现使用该cblas接口要容易得多,它只是原始 Fortran 代码的一个薄包装。

在这种方法中,您必须为矩阵创建自己的类,这与 Fortran 对矩阵是什么的理解兼容。最简单的方法可能是继承std::vectorstd::valarray提供您自己的索引操作。是的,这有点工作。但这并不像听起来那么糟糕:-)。

ssteqr顺便说一句,小心使用带有双精度参数的单精度例程 ( )。LAPACK 不会报告任何错误,但结果将是完全错误的。

于 2011-12-10T19:41:08.193 回答