C++ C++;

C++ C++;,c++,sparse-matrix,solver,algebra,C++,Sparse Matrix,Solver,Algebra,各位。 我对线性代数方程求解器几乎没有经验。 但是现在,我需要解大型稀疏块压缩线性方程。 i、 例如,Ax=b 矩阵A由大小为(nb,nb)的子块组成。而A的大小是(N,N)子块。 那么矩阵A的实际大小是(nb*N,nb*N) 只有很少的子块存在。而A是对角占优的 我试过Eigen内置的Slover。i、 例如,simplicalllt和biggstab,前者速度较慢,而后者无法收敛 然后我用英特尔MKL尝试了第三方Eigen解算器,即Pardisolt、PardisoLDLT和PardisoL

各位。 我对线性代数方程求解器几乎没有经验。 但是现在,我需要解大型稀疏块压缩线性方程。 i、 例如,
Ax=b

矩阵
A
由大小为
(nb,nb)
的子块组成。而
A
的大小是
(N,N)
子块。 那么矩阵
A
的实际大小是
(nb*N,nb*N)

只有很少的子块存在。而
A
是对角占优的

我试过Eigen内置的Slover。i、 例如,simplicalllt和biggstab,前者速度较慢,而后者无法收敛

然后我用英特尔MKL尝试了第三方Eigen解算器,即Pardisolt、PardisoLDLT和PardisoLU。他们也很慢

最后,我尝试了使用SuiteSparse的第三方Eigen解算器,即CHOLMOD和SPQR。第一个很慢,而第二个给出了相同的输入值,似乎不起作用

我想可能是因为我错误地使用了解算器,所以我没有利用“块压缩”功能,从而触发了大量无用的计算


谁能给我一些建议吗?

只要矩阵大小不超过5000行/列,使用稀疏解算器不会带来任何合理的好处;对于这样的矩阵,普通的密集解算器也不错,因为它不包含与存储和操作稀疏结构(如链表或邻接结构)相关的“开销”。另一方面,如果您的矩阵非常大(例如,大约一百万行/列),则迭代解算器只能工作。我建议您访问以下网页,其中包含与您正在使用的非常类似的问题和解决方案的描述(包括具有块结构的稀疏矩阵系统的解决方案,以及图像处理):

N有多大?当你使用cholmod时,你使用GPU了吗?如果没有一些代码或构建环境细节,就很难提供帮助。它可能非常大。目前,我尝试使用大小为1200*1200的矩阵。(即,Nb为12,N为100)。我目前只有一张GTX1080卡,但我必须使用“双精度”来保持精度。所以,也许gpu不是一个好的选择。我有一个SOR迭代解算器,它是为这个块压缩方程设计的。SOR解算器求解该方程约1500次,耗时约110秒。而带有本征界面的cholmod解算器大约需要330秒。但是SOR解算器只能使用1个线程,这在大型方程情况下会很慢。矩阵1200*1200对于稀疏矩阵来说不是一个大尺寸。它的稀疏性是什么(非零/1200/1200)?330秒只够给cholmod打一个电话?谢谢你,Masud和ztik。我发现我的IDE(QtCreator)使方程求解时间增加了一倍,因为我在调试过程中已经超过一周没有重新启动它了。当我重新启动QtC造饰者时,用SUITESPARS解析器求解EGIN比在方程12000×12000(即NB=12,n=1000)中的当前方程求解工具要快。如果你找不到一个好的求解器,你可以考虑我给你的参考。随附CD-ROM的小册子提供(它肯定适用于非常大的矩阵;唯一的限制是矩阵的条件比,即矩阵应具有合理的条件,c.r.值最多不超过10^4或10^5,否则可能无法保证收敛性):Erwin Kalvelagen:您使用什么产品,在什么平台上使用?如果您能提供一个可靠的例子,这样的问题和解决方案,将不胜感激。