c++ - 调用 ARPACK 反向通信矩阵 vector 例程

标签 c++ fortran arpack

我正在尝试用 C++ 编写一个驱动程序,以使用 ARPACK 提供的 Fortran 函数计算非对称实值稀疏矩阵的特征值,但我在反向通信方法方面遇到了一些麻烦。

一般来说,我尝试求解正态特征值方程:

A*v = lambda*v

与矩阵 A 的任何交互都是通过函数“av”在 ARPACK 中完成的:

av(n, workd[ipntr[0]], workd[ipntr[1]])

它乘以从位置“ipntr[0]”开始的数组“workd”中保存的 vector ,并将结果插入到从位置“ipntr[1]”开始的数组“workd”中。 http://www.caam.rice.edu/software/ARPACK/ 的手册中给出了这种方法的示例。以及 ARPACK/EXAMPLES/SIMPLE/dnsimp.f 代码中。

我想知道的是我实际上如何涉及矩阵A?如果它没有传递给例程,那么如何找到它对提供的 vector 的操作?

在示例代码 dnsimp.f 中,它们的矩阵 A 在函数“av”中计算,并且“从二维对流扩散算子的标准中心差分离散化中导出”。但是,我相信这是特定问题?将矩阵 A 的推导编码到函数中似乎也不太有用。我也无法从手册中找到太多这方面的信息。

这似乎不是什么大问题,因为它是一个用户定义的函数,我只需更改“av”的定义即可将矩阵 A 作为参数包含在内。但是,我想知道在出现任何潜在的兼容性问题时如何正确完成。

谢谢!

最佳答案

您不必向 ARPACK 提供矩阵。

您所要做的就是将矩阵与返回的 vector 相乘(因此,反向通信),直到达到所需的收敛。

有关算法的信息,您应该查看 users guide尤其是在 chapter about the underlying algorithms 上.

对评论的回应:底层算法是 Arnoldi Iteration 的一种形式。基本算法见wikipedia并显示,矩阵 A 不会被访问。既不是直接的,也不是间接的。

特别是,算法从任意归一化 vector q_1 开始。该 vector 返回给用户。用户使用他们最喜欢的例程(通常是一些有效的稀疏矩阵 vector 乘法)将该 vector 与矩阵 A 相乘,并将结果返回到 Arnoldi 迭代 以计算 Hessenberg 矩阵 H 的一部分(其特征值通常收敛到 A) 和下一个 vector q_2 的极值特征值。这必须迭代,直到你的结果收敛。

关于c++ - 调用 ARPACK 反向通信矩阵 vector 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26101752/

相关文章:

math - Scipy arpack eigs 与特征值的 eigsh 数

string::find 的 C++ 正则表达式等价物

c++ - OpenGL 索引数组

c++ - 如何从 RE2 检索完整的正则表达式匹配?

c++ - 使用 std::vector <mutex*> 调用 std::lock ()

module - Fortran 模块版本 fatal error

c++ - Arpack++ 稀疏特征求解器比等效的 Matlab eigs() 慢很多倍

arrays - 如何将标量传递给 Fortran 子程序的向量(一维数组)?

fortran - Fortran 语言中的 10.D00 是什么意思?

python - 使用ARPACK求解特征值问题,但与Matlab得到的结果不一致