gpt4 book ai didi

c++ - 如何读取C++代码或: What to do without documentation?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:46 26 4
gpt4 key购买 nike

这个问题听起来可能有点奇怪:我想使用 Boost 的 ublas 和 ATLAS/Lapack 进行数字矩阵计算。我正在使用 Boost numeric bindings在这两个库之间进行交互。但是,要么我就是找不到它,要么没有关于如何使用这些绑定(bind)的适当文档。另外,我是 Boost 的新手(实际上通常是 C++),所以我很难找到如何在我的代码中使用 Lapack 提供的函数。

我最终要解决的问题是找到对称带状矩阵的特征值和特征向量。据我了解,我会使用 lapack::steqr为了这。问题是,我不知道如何正确调用函数。在数字绑定(bind)的代码中,我可以看到类似这样的内容:

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&)

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

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

最佳答案

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

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

顺便提一下,请注意使用带有 double 参数的单精度例程 (ssteqr)。 LAPACK 不会报告任何错误,但结果将是完全错误的。

关于c++ - 如何读取C++代码或: What to do without documentation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com