Matlab Linprog能支持的最大矩阵大小是多少?

3
我希望使用MATLAB的linprog来解决一个问题,并通过一个更小、更简单的示例进行检查。
但我想知道MATLAB是否支持我的实际问题,因为可能会有一个300*300*300*300矩阵...
也许我应该给出确切的问题。有一个网络节点的有向图,我想在一些限制条件下获得边缘容量的最低利用率。假设m是边的数量,n是节点的数量。共有mn²个变量和nm²个约束条件。不幸的是,n可能达到300...
我想使用MATLAB的linprog来解决它。如上所述,我担心MATLAB无法支持它...最后,矩阵必须是稀疏的,有没有办法简化它?

我曾经在实验室里使用过一台1TB(1000GB!)的RAM机器......您可以执行“zeros(300,300,300,300);”并仍然有足够的剩余空间......那些是快乐的时光...... - Shai
@Shai:给我给我给我! - Rody Oldenhuis
@RodyOldenhuis 我不再能够使用这台神奇的机器了,但它就像魔法一样。 - Shai
太棒了...我希望能得到一个。 - CPT
3个回答

1
在我的系统上,安装了24GByte的内存,运行Matlab R2013a时,memory会返回以下结果:
Maximum possible array:     44031 MB (4.617e+10 bytes) *
Memory available for all arrays:     44031 MB (4.617e+10 bytes) *
Memory used by MATLAB:      1029 MB (1.079e+09 bytes)
Physical Memory (RAM):     24574 MB (2.577e+10 bytes)

*  Limited by System Memory (physical + swap file) available.

在64位版本的Matlab上,如果你有足够的RAM,至少应该可以创建一个像你建议的那样大的完整矩阵,但是linprog能否在实际时间内对其进行有用的处理是另一个问题。除了研究使用sparse矩阵外,您还可以考虑使用single精度:这将从一开始减少一半的内存使用。

1
首先:一个300*300*300*300的数组不被称为矩阵,而是张量(或简单地说是数组)。因此,您不能在它上面使用矩阵/向量代数,因为这对于维度大于2的数组没有定义,并且您肯定不能在linprog中使用它而不进行某种解释步骤。
其次:如果我将300⁴解释为矩阵中的元素数量(而不是大小),那么这真的取决于MATLAB(或任何其他软件)是否支持。
如Ben所回答的,如果你的矩阵是“满的”,那么答案很可能是“不行”。300^4个双精度数将占用近65GB的内存,因此几乎不可能有任何软件包能够从内存中处理所有这些(除非你实际上有> 65 GB的RAM)。您可以使用类似于 blockproc 的方案,其中您只加载部分矩阵到内存中,而将其余部分留在硬盘上,但这是极其缓慢的。此外,如果您有如此巨大的矩阵,则完全有可能您正在忽略简化问题的某些方法。
如果您的矩阵是“稀疏”的(即包含大量零),则也许可以。看一下MATLAB的sparse命令。
那么,你的问题到底是什么?这个巨大的矩阵是从哪里来的?也许我或其他人会看到一种方法,可以将该矩阵减少到更易管理的内容。

非常感谢您的回复。300300300*300是指矩阵的高度(宽度),并且该矩阵是稀疏的...是否有任何方法可以帮助我处理这个问题? - CPT
1
@CPT: 那就取决于你的矩阵有多么稀疏了...为什么不尝试用sparse命令构建你的真实矩阵A,如果可以的话,直接将其投入到linprog中看看会发生什么? - Rody Oldenhuis
我给我的问题添加了一些描述。我稍后会尝试您的建议,非常感谢。 - CPT

0

你可以简单地尝试一下:X=zeros( 300*300*300*300 ) 在我的系统上,这给了我一个非常清晰的语句:

>> X=zeros( 300*300*300*300 )
Error using zeros
Maximum variable size allowed by the program is exceeded.

由于zeros是一个内置函数,它只能用零填充给定大小的数组,因此您可以假设处理这样的数组是不可能的。

您还可以使用memory命令。

>> memory
Maximum possible array:     21549 MB (2.260e+10 bytes) *
Memory available for all arrays:     21549 MB (2.260e+10 bytes) *
Memory used by MATLAB:       685 MB (7.180e+08 bytes)
Physical Memory (RAM):     12279 MB (1.288e+10 bytes)

*  Limited by System Memory (physical + swap file) available.

>> 2.278e+10 /8   
%max bytes avail for arrays divided by 8 bytes for double-precision real values

ans =
2.8475e+09

>> 300*300*300*300

ans =
8.1000e+09

这意味着我甚至没有足够的内存来存储这样一个数组。

虽然这可能并没有直接回答你的问题,但它可能仍然会给你一些启示。


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