MATLAB稀疏矩阵求解器?内存错误。

5
在有限元问题的背景下,我有一个12800x12800稀疏矩阵。我试图仅使用MATLAB的\运算符来解决线性系统,但使用mldivide时会出现内存不足错误。所以我想知道是否有一种方法可以加快这个过程。
我的意思是,LU分解之类的方法是否能够在避免内存错误方面起到作用?我已经将首选项中的堆大小增加到了256 GB,这是我能够得到的最大值,但我仍然遇到了内存不足错误。
另外,还有一个普遍的问题。我现在的笔记本电脑上有8GB的RAM。升级到16GB会有任何帮助吗?或者我可以做些什么来为MATLAB分配更多的内存?我对这方面的知识相当陌生。 enter image description here

2
我曾经研究过Matlab的mldivide实现。这是一段高度优化的代码:考虑到输入的类型和稀疏性。我认为,除非你专门针对你的特定配置进行定制,否则很难找到比它更好的解决方案。 - Shai
你能否发布一个稀疏模式的图形吗?(使用 spy(A) 创建) - Rody Oldenhuis
你尝试过LU分解或其他分解方法吗?另外,如果你在谈论Java堆内存,那对于核心MATLAB函数是没有帮助的。 - chappjc
1
尝试使用amd置换:perm=amd(A); A=A(perm,per); 这倾向于限制因子中的非零条目数量,即直接求解器(由mldivide使用)中的数量。此外,如果您的矩阵是对称的,请使用L=chol(tril(A))而不是mldivide-它仅使用一半的空间。 - angainor
这个问题还有关联吗?如果是的话,你看过 help sparfun 吗?你可以尝试一下在 线性方程(迭代方法) 部分提到的一些函数。 - Rody Oldenhuis
4个回答

0

虽然反斜杠利用了A的稀疏性,但它使用的QR方法会产生需要(占用元素数)^ 3内存的完整矩阵。您可以尝试以下几件事:

  1. 如果要将稀疏矩阵分成几个对角线,则可以尝试使用前向/后向替换解决系统问题
  2. 尝试将问题拆分为较小的问题
  3. 在开始矩阵除法之前运行“ whos”以查看占用内存的元素,这些元素是否可以事先清除?
  4. 对于您在此处声明的系统不适用,但如果您的系统已定义(A的行数多于列数),则使用伪逆 (A.'* A) \ (A.' * b) 可以使用更小的列维度生成结果

至于添加额外的内存; Matlab32使用2 ^ 32字节的内存(4 Gb),因此增加计算机的物理RAM除非你使用64位版本否则没有帮助。


0

你是否被锁定使用mldivide?这似乎是迭代方法(bicg,gmres等)的完美应用场景?


0
根据thisthis,您有一些选项可以避免Matlab中的内存不足问题:
  • 增加操作系统的虚拟内存
  • 在任务管理器中为MATLAB进程提供更高的优先级
  • 使用64位版本的MATLAB
几个月前,我在Matlab中进行整数规划时遇到了“内存不足”问题,因此我使用了稀疏矩阵并遵循了上述提示,最终问题得到了解决!

0

MATLAB \ 通常会尝试多种方法来解决问题。首先,如果它看到您的矩阵结构对称,它会尝试进行Cholesky分解。在几个步骤之后,如果找不到合适的答案,当前版本的Matlab使用UMFPACK Suitsparse 包。

UMFPack是一种特定的LU实现,以其速度和实际内存使用效率而闻名。它还试图减少填充并尽可能保持矩阵稀疏。这就是为什么MATLAB使用此代码的原因。(我正在我的博士学位中在Tim Davis博士的指导下研究UMFPACK,他是UMFPACK的创造者)

因此,使用另一种LU分解方法是没有帮助的。它已经是一个LU分解了。解决问题的最简单方法之一是在具有更好内存的另一台设备上测试您的问题,看看是否有效。

我猜matlab会进行一些垃圾回收并浪费一些内存,所以如果您直接使用UMFPACK可能会有所帮助。您可以将其实现在C/C++中,也可以使用MATLAB接口。请查看SuitSparse包。

根据您的矩阵结构,我认为MATLAB尝试使用Cholesky;如果Cholesky在内存管理方面失败,我不知道MATLAB的策略是什么。请注意,Cholesky在内存管理方面更容易处理。

还有其他软件包可能也会对您有所帮助。CSparse是一个轻量级的软件包,可能会有所帮助。还有其他著名的软件包可能会有所帮助;搜索superLU。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接