调用ARPACK反向通信矩阵向量例程 我尝试用C++编写一个驱动程序,用ARPACK提供的FORTRAN函数计算一个非对称实值稀疏矩阵的特征值,但反向通信方法有点麻烦。p>

调用ARPACK反向通信矩阵向量例程 我尝试用C++编写一个驱动程序,用ARPACK提供的FORTRAN函数计算一个非对称实值稀疏矩阵的特征值,但反向通信方法有点麻烦。p>,c++,fortran,arpack,C++,Fortran,Arpack,一般来说,我试图求解标准特征值方程: A*v = lambda*v 与矩阵A的任何交互都是通过函数“av”在ARPACK中完成的: av(n, workd[ipntr[0]], workd[ipntr[1]]) 它将从位置“ipntr[0]”开始的数组“workd”中的向量相乘,并将结果插入从位置“ipntr[1]”开始的数组“workd”中。该方法的示例在手册中以及ARPACK/Examples/SIMPLE/dnsimp.f代码中给出 我想知道的是,我实际上如何涉及矩阵A?如果它没有传递

一般来说,我试图求解标准特征值方程:

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

av(n, workd[ipntr[0]], workd[ipntr[1]])
它将从位置“ipntr[0]”开始的数组“workd”中的向量相乘,并将结果插入从位置“ipntr[1]”开始的数组“workd”中。该方法的示例在手册中以及ARPACK/Examples/SIMPLE/dnsimp.f代码中给出

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

在示例代码dnsimp.f中,其矩阵A在函数“av”内计算,并“从二维对流扩散算子的标准中心差分离散化中推导”。然而,我相信这是具体问题吗?将矩阵A的推导编码到函数中似乎也不太有用。我在手册上也找不到太多关于这方面的信息

这似乎不是一个太大的问题,因为它是一个用户定义的函数,所以我可以更改“av”的定义,将矩阵a作为一个参数。但是,我想知道如何正确地处理任何潜在的兼容性问题


谢谢大家!

您不必向ARPACK提供矩阵

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

有关算法的信息,您应该查看,尤其是

回复评论:底层算法是Arnoldi迭代的一种形式。基本算法如和所示,矩阵A将不会被访问。既不是直接的,也不是间接的


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

我知道ARPACK不直接需要矩阵,我想知道处理反向通信部分的函数“av”如何访问矩阵A以执行矩阵向量积。在不将其传递给函数的情况下(并因此更改其建议的声明格式),我能看到它工作的唯一方法是将A声明为全局变量。更改声明对于我个人来说是很好的,尽管我很好奇是否有更好的方法可以与使用其方法的其他代码兼容。很抱歉,我可能对此非常不清楚!我的问题不是底层算法,而是如何将矩阵A转化为我最喜欢的例程。在示例中,他们最喜欢的例程是上面定义的函数“av”,并且函数中已经编码了A(不理想)。正如您所说,需要矩阵A来计算乘积,但问题是如果矩阵A没有作为参数传递给“av”,如何使用矩阵A。我想一个全局变量会起作用,但我会坚持修改声明。谢谢你的帮助!好吧,我也得道歉。。。现在,我明白你的意思了。他们以尽可能短的方式为示例矩阵定义了矩阵向量积。这就是为什么它没有明确地出现的原因。通常,你会用一个例程来替换这个例程,这个例程不是ARPACK库的一部分(只是一个示例),它将你的矩阵与返回的向量相乘。太棒了,谢谢你清理了它。我不确定是否有一个标准的方法来确保兼容性,但现在我可以自由地更改格式,这是有意义的。干杯