如何用matlab求解Ax=b,其中A是一个大型非对称稀疏矩阵?

如何用matlab求解Ax=b,其中A是一个大型非对称稀疏矩阵?,matlab,sparse-matrix,Matlab,Sparse Matrix,我使用的是Ax=b,其中A非常大(超过1m*1m大小),在matlab中是非对称稀疏矩阵。我以稀疏的方式构建A。但是,直接使用A\b太慢了。我尝试了gmres。然而,如果没有预处理,我就无法得到正确的答案,而使用预处理(ilu)也太慢了 我怎样才能有效地解决这个问题?Thx.很难给出一个明确的答案,因为它取决于您正在解决的系统的细节。不幸的是,这涉及到你方的大量尝试和错误,并且没有保证任何系统都能工作的方法。以下是一些需要考虑的事项: 系统有多稀疏,速度有多慢?1Mx1M是一个相当大的系统,但工

我使用的是
Ax=b
,其中A非常大(超过1m*1m大小),在
matlab
中是非对称稀疏矩阵。我以稀疏的方式构建
A
。但是,直接使用
A\b
太慢了。我尝试了
gmres
。然而,如果没有预处理,我就无法得到正确的答案,而使用预处理(
ilu
)也太慢了


我怎样才能有效地解决这个问题?Thx.

很难给出一个明确的答案,因为它取决于您正在解决的系统的细节。不幸的是,这涉及到你方的大量尝试和错误,并且没有保证任何系统都能工作的方法。以下是一些需要考虑的事项:

  • 系统有多稀疏,速度有多慢?1Mx1M是一个相当大的系统,但工作取决于非零的数量;因此,如果您的系统有许多非零,那么是的,它将需要一段时间才能运行;另一个可能导致长时间运行的方面是系统的数值调节不佳(请参阅和);预处理应该有助于这一点,只要您使用有效的预处理程序
  • 尝试另一种迭代方法:例如or,它也适用于不对称系统
  • 尝试调整预调节器或使用不同的预调节器:增加下降容差将导致更稀疏的预调节器,这可能会影响收敛,但会减少每次迭代的总工作量(小于下降容差的值在因子分解过程中从稀疏矩阵中移除);您还可以调整预编码器的类型
    ilu(0)
    crout
    ilutp
  • 确保您正在使用BLAS库的并行和优化实现,如英特尔MKL BLAS或至少开放BLAS;这将大大加快直接法的速度
  • 最后,您可以尝试使用不同的框架;其他框架还允许您直接选择ILU预条件器的填充级别(提供更多选项供您探索,这将导致预条件器更密集,但具有更好的收敛行为);其他框架如PetSC也支持更广泛的和
    这取决于许多参数。你做了多少次这种计算?您是否总是使用相同的矩阵
    A
    并求解
    b
    的不同值。我只计算一次。2.不。我每次运行程序时都会生成
    A
    b
    。嗯,Matlab已经对线性代数问题进行了优化,这很正常,对于非常大的矩阵来说速度很慢。我看不出你的计算速度有多快。如果你的矩阵有特定的属性,我唯一的建议就是使用
    linsolve
    。你看到了吗?也许我可以用C/C++。。。。。