我想使用MATLAB linprog
来解决问题,我通过一个更小,更简单的例子来检查它。
但是我想知道MATLAB是否可以支持我的实际问题,可能有一个300*300*300*300
矩阵......
也许我应该提出确切的问题。有一个网络节点的有向图,我想在一些约束条件下获得边缘容量的最低利用率。设{4}为边数,m
为节点数。有n
个变量和mn²
个约束。不幸的是,nm²
可能会达到300 ...
我想用MATLAB n
来解决它。如上所述,我担心MATLAB不能支持它......最后矩阵必须是稀疏的,有时可以简化它吗?
答案 0 :(得分:1)
首先:300*300*300*300
数组不是矩阵,而是张量(或简称数组)。因此,您不能在其上使用矩阵/向量代数,因为没有为维度大于2的数组定义,如果没有某种解释步骤,您当然不能在linprog
中使用它。
第二:如果我将300⁴
解释为表示矩阵中元素的数量(而不是大小),那实际上取决于MATLAB(或任何其他软件)是否可以支持那。
正如本已经回答的那样,如果您的矩阵已满,那么答案可能是否。 300^4
doubles
将占用近65GB的内存,因此任何软件包都不太可能从内存中处理所有内容(除非你实际拥有> 65 GB的内存)。您可以使用blockproc
- 类型方案,其中您只在内存中加载矩阵的一部分,而将其余部分保留在硬盘上,但这非常慢。此外,如果您的矩阵 很大,那么您完全有可能忽略一些可以简化问题的方法。
如果矩阵是稀疏(即包含大量零),那么可能。看看MATLAB的sparse
命令。
那么,你的问题究竟是什么?这个庞大的矩阵来自哪里?也许我或其他人看到了一种方法,可以将该矩阵简化为更易于管理的东西。
答案 1 :(得分:1)
在我的系统上,安装了24GByte RAM,运行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
精度:将内存使用量减少一半。
答案 2 :(得分: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
这意味着我甚至没有内存来存储这样的数组。
虽然这可能无法直接回答您的问题,但仍可能会给您一些见解。