Matlab 求解Ax=b,其中A太大,无法存储在单个数组中

Matlab 求解Ax=b,其中A太大,无法存储在单个数组中,matlab,matrix,scientific-computing,equation-solving,Matlab,Matrix,Scientific Computing,Equation Solving,问题:A是正方形、满秩、稀疏和带状的。它的元素太多,无法在Matlab中存储为单个矩阵(至少~4.6*1018,理想情况下~1040,两者都超过。编辑:a存储为稀疏,问题不在于内存有限,而在于元素数量有限)。因此,我必须将其存储为较小数组(行/对角线/列/块)的集合 寻找:一种解决Ax=b的方法,将给定的a作为较小数组的集合。最好使用Matlab,但不是必须的。 或者,如果不是在Matlab中:也许有一个程序可以存储和求解这么大的一个问题 到目前为止发现:如果A是三对角/五对角的,但我的A有N条

问题:A是正方形、满秩、稀疏和带状的。它的元素太多,无法在Matlab中存储为单个矩阵(至少~4.6*1018,理想情况下~1040,两者都超过。编辑:a存储为稀疏,问题不在于内存有限,而在于元素数量有限)。因此,我必须将其存储为较小数组(行/对角线/列/块)的集合

寻找:一种解决Ax=b的方法,将给定的a作为较小数组的集合。最好使用Matlab,但不是必须的。
或者,如果不是在Matlab中:也许有一个程序可以存储和求解这么大的一个问题

到目前为止发现:如果A是三对角/五对角的,但我的A有N条对角。还发现了一些关于将A划分为块的内容,但找不到一种方法来解决具有这些块的线性系统

p、 系统是64位的


谢谢大家

如果您可以访问MATLAB的并行计算工具箱和MATLAB分布式计算服务器,则可以将
A
存储为
分布式阵列
,即单个阵列,其元素分布在集群中多台机器的内存中。您可以在分布式阵列上直接调用MATLAB的反斜杠命令,MATLAB为您处理并行化。

不使用MATLAB将允许您存储更大的阵列。CERN开发的开放源码框架具有C++和Python接口以及各种解决方案。它还能够处理庞大的数据集,并拥有各种可视化和分析工具


如果您对编写C或Fortran和CBLAS感兴趣,将是很好的选择。大多数Linux/UNIX发行版都应该有许多BLAS的开源和专有实现。还有很多例子展示了如何在C和Fortran代码中使用BLAS子例程,这些例子可以在网上找到。

我想把它作为一个注释,但我认为最好将其作为一个答案。 你的问题很严重。这不仅是索引的问题,也是内存的问题:4.6x10^18太大了。即4.6 exa元素。如果将它们存储为真正的单精度,则需要4x4.6 EB的内存。据我所知,一台内存如此巨大的计算机还不存在。要存储这样一个矩阵,您需要收集世界上大部分计算机的所有存储(硬盘,而不是RAM)。想想看。目前,使用10^40元素几乎是不切实际的。对于64位计算机,64位地址空间可以承载4.6x10^18个元素。64位地址(或整数)可以直接索引2^64个元素,大约是16x10^18。所以你必须三思而后行

回到问题本身,有可能将矩阵转化为隐式运算符。通过隐式操作符,我的意思是,你不需要存储它,因为它有一个你知道如何复制的模式,或者你可以将它应用到一个向量,而不需要实际形成矩阵。如果你手头有矩阵,考虑到我上面所说的,你很可能处于这种情况。
如果是这种情况,要解决问题,只需使用迭代解算器并提供一个执行矩阵乘法的黑盒。转到其他方向可能会浪费您的时间。

是否将您的矩阵定义为普通矩阵?不明确地作为?后者会为您节省大量内存。对于解决问题:可能是有帮助的。我从未使用过稀疏矩阵,无法进一步帮助您,但其他人肯定可以;)<代码>稀疏也有大小限制。检查
计算机
的第二个输出参数,它返回可以索引的最大元素数<代码>[~,最大大小]=计算机。我不在这里链接它们,因为它们取决于您的matlab版本,但据我所知,没有任何版本支持4.6*10^18元素。您需要找到一个使用函数指针/句柄而不是存储在内存中的数组的解算器。我只是很快地看了看,但什么也没找到。然而,我相信有一个是存在的。话虽如此,我怀疑无论使用何种解算器,那么多元素的精度都会有问题。AnonSubmitter85:听起来很有希望,你对这种解算器有什么关键字或搜索方向吗?@OOO。很抱歉之前的评论,我没有意识到限制因素是元素的数量,而不是内存。正如Anon所建议的,对于这种规模的系统,您必须找到一些特殊的算法。作为初学者,你可以看看这个方法。这本书读得很长,但很有前途。我不知道是否有现成的解算器使用此算法。听起来很有趣,谢谢!我查找了它们,但没有找到以下内容:您知道分布式数组是否可以包含比常规数组更多的元素吗?我认为问题在于元素索引是有限的。分布式阵列是否克服了这一问题?@OOO如果您的不同工作线程位于不同的计算机上,那么分布式阵列可能比常规阵列包含更多的元素(因此您实际上增加了可用的总内存)。否则,在同一台机器的多个内核上分配工作只会增加处理时间,而不会增加额外内存。@Hoki谢谢。只是为了确保:我的问题不在于内存,而在于元素的数量(即,一个空的稀疏矩阵的大小受此页面的限制:),多台机器上的分布式数组的元素数量会增加吗?OP已经声明它是一个稀疏矩阵。@rlbond我不明白你的意思。你能解释一下吗?@rlbond,我还是不明白。我在稀疏矩阵方面有一些经验。你能指出我所说的与OOO所说的相矛盾,或者与稀疏矩阵相矛盾的东西吗?OP说他们的矩阵大部分是零,那些在稀疏矩阵数据结构中不使用内存。我现在明白了。OOO还说他们的