在有限元问题的背景下,我有一个12800x12800稀疏矩阵。我正在尝试使用MATLAB的\
运算符求解线性系统,并使用mldivide得到内存不足错误。所以我只是想知道是否有办法加快速度。
我的意思是,像LU分解这样的东西实际上有助于解决内存错误吗?我在首选项中将堆大小增加到256 GB,这是我可以获得的最大值,并且仍然会出现内存不足错误。
另外,只是一个普遍的问题。我现在的笔记本电脑上有8GB的RAM。升级到16GB会有帮助吗?或者我可以做些什么来为MATLAB分配更多内存?我对这些东西很不熟悉。
答案 0 :(得分:0)
根据this和this,你有一些选项可以避免在matlab中出现内存不足问题:
几个月前,我正在使用matlab进行整数编程。我遇到了“内存不足”的问题,所以我使用稀疏矩阵并按照提到的提示,最后问题解决了!
答案 1 :(得分:0)
你是否被锁定使用mldivide?听起来像迭代方法的完美情况 - bicg,gmres等?
答案 2 :(得分:0)
虽然反斜杠利用了A的稀疏性,但它使用的qr方法产生需要(number_occupied_elements)^ 3内存的完整矩阵。你可以尝试一些事情
(A.'*A)\(A.'*b)
会产生使用较小列维度的结果< / LI>
醇>
至于增加额外的记忆; Matlab32使用2 ^ 32字节的内存(4 Gb),因此增加计算机上的物理RAM将无济于事,除非您使用的是64位版本。
答案 3 :(得分:0)
MATLAB \
通常会尝试几种方法来解决问题。首先,如果它看到矩阵的结构是对称的,那么它会尝试Cholesky分解。经过几个步骤后,如果找不到合适的答案,当前版本的Matlab使用UMFPACK Suitsparse包。
UMFPack是一种特定的LU实现,它以其在实践中的速度和良好的内存使用而闻名。它还尝试减少填充并尽可能保持矩阵稀疏。这就是MATLAB使用此代码的原因。 (我正在UMFPACK为我的博士学位,在其创建者Tim Davis博士的监督下)
因此,使用另一个LU分解将无济于事。它已经是一个LU分解。 解决问题的最简单方法之一是在具有更好内存的其他设备上测试您的问题,看它是否有效。
我猜matlab会做一些垃圾收集并浪费一些内存,所以如果直接使用UMFPACK,它可能对你有帮助。您可以在C / C ++中实现它,也可以使用MATLAB接口。看看SuitSparse包。
根据矩阵的结构,我认为MATLAB试图使用Cholesky; 如果Cholesky在内存管理方面失败,我不知道MATLAB的策略是什么。考虑到Cholesky在内存方面更容易管理。
还有其他套餐也可能对您有所帮助。 CSparse是一个轻量级的包,它可能会有所帮助。还有其他着名的软件包可能会有所帮助;搜索superLU。