首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用ARPACK反向通信矩阵向量例程

调用ARPACK反向通信矩阵向量例程
EN

Stack Overflow用户
提问于 2014-09-29 14:02:24
回答 1查看 775关注 0票数 0

我试图用C++编写一个驱动程序来计算非对称实值稀疏矩阵的特征值,使用ARPACK提供的fortran函数,但是反向通信方法有点麻烦。

一般情况下,我试图求解正常的特征值方程:

代码语言:javascript
运行
复制
A*v = lambda*v

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

代码语言:javascript
运行
复制
av(n, workd[ipntr[0]], workd[ipntr[1]])

它将从位置'ipntr‘开始的数组'workd’中的向量乘以,并将结果插入从位置'ipntr1‘开始的数组'workd’。在http://www.caam.rice.edu/software/ARPACK/的手册中给出了这种方法的例子,也在ARPACK/ Examples /SIMPLE/dnsimp.f代码中给出了示例。

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

在示例程序dnsimp.f中,它们的矩阵A是在函数'av‘内计算的,它是由二维对流扩散算子的标准中心差分离散导出的。不过,我相信这是具体的问题吗?将矩阵A的派生编码到函数中似乎也不太有用。我从手册上也找不到多少这方面的信息。

这似乎不是太大的问题,因为它是一个用户定义的函数,我可以更改'av‘的定义,以包括矩阵A作为参数。不过,我想知道,在遇到任何潜在的兼容性问题时,如何正确地进行操作。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-29 18:27:32

你不需要把矩阵提供给ARPACK。

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

有关算法的信息,您应该查看用户指南,特别是关于底层算法的章节

对评论的回应:底层算法是Arnoldi迭代的一种形式。基本算法在维基百科中显示,矩阵A不会被访问。既不是直接的也不是间接的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26101752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档