这个问题可能听起来有点奇怪:我想使用Boost的ublas和ATLAS / Lapack进行数值矩阵计算。我使用Boost numeric bindings来连接这两个库。但是,要么我找不到它,要么没有关于如何使用这些绑定的适当文档。另外,我是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(...)
一起使用的东西 - 即使我无法编译,也不能使用double数组或使用{ {1}}。
所以我的问题是:一般来说:当我找到没有完整文档的库时,如何找到如何调用函数?我主要来自C,并且对所有这些模板非常困惑。是真正追踪代码中所有内容的唯一方法吗?还是有小动作?或者我可以从错误消息中提取信息吗?
此类错误消息的一个示例是,对于以下代码:
ublas::matrix
然后我在编译期间得到:
ublas::matrix<double> empty(N,N);
std::cout << traits::matrix_size1<ublas::matrix>(empty) << std::endl;
候选人列在那里可能很有用,但我不知道,如何阅读这一行并相应地调整我的代码。
再次提出:关于如何处理这样的事情,这个问题有点笼统。我知道类和模板的基本概念,但这对我的知识来说有点过于抽象。
答案 0 :(得分:1)
由于我不太精通模板化的c ++,我个人觉得使用cblas
接口要容易得多,因为它只是原始Fortran代码的一个薄包装器。
在这种方法中,你必须为矩阵创建自己的类,这将与Fortran对矩阵的理解兼容。最简单的方法可能是继承std::vector
或std::valarray
并提供自己的索引操作。
是的,这有点工作。但它没有听起来那么糟糕:-)。
顺便提一下,请注意使用具有双精度参数的单精度例程(ssteqr
)。 LAPACK不会报告任何错误,但结果将是完全错误的。