在Matlab中存储循环中生成的单个矩阵的有效方法?

时间:2014-11-26 11:05:12

标签: matlab matlab-figure

我想知道是否有办法减少Matlab中以下代码段所使用的内存量:

n=3;
T=100;
r=T*2;
b=80;
BS=1000
bsuppostmp_=cell(1,BS);
bslowpostmp_=cell(1,BS); 
bsuppnegtmp_=cell(1,BS);
bslownegtmp_=cell(1,BS);

for w=1:BS
bsuppostmp_{w}= randi([0,1],n*T,2^(n-1),r,b);   
bslowpostmp_{w}=randi([0,3],n*T,2^(n-1),r,b);
bsuppnegtmp_{w}=randi([0,4],n*T,2^(n-1),r,b);
bslownegtmp_{w}=randi([0,2],n*T,2^(n-1),r,b);
end

我决定使用矩阵单元格,因为在这个循环之后我需要在另一个循环中单独调用每个单个矩阵。

如果我运行此代码,则会收到消息错误"您的系统已耗尽应用程序内存"。

您是否知道存储每个单个矩阵的更有效(在内存方面)?

1 个答案:

答案 0 :(得分:0)

让我们参考有关Strategies for Efficient Use of Memory的页面:

  

因为简单的数字数组(包含一个mxArray)具有最小的开销,所以应尽可能使用它们。当数据太复杂而无法存储在简单数组(或矩阵)中时,您可以使用其他数据结构。

     

单元格数组由每个元素的单独mxArrays组成。因此,具有许多小元素的单元阵列具有很大的开销。

我怀疑单元阵列的开销真的很大......

让我给出一个可能的解释。如果将4D数组存储到单元阵列中,Matlab无法使用交换文件,该怎么办?存储大型数字数组时,不会出现内存不足错误,因为当使用的内存变得太大时,Matlab会使用交换文件来缓存每个变量。然而,如果每个4D阵列存储在超级单元阵列中,Matlab将其视为单个变量,并且不能将其分成RAM部分并且部分在交换文件中。好吧,我不在Mathworks工作,所以我不知道我是否正确,这只是一个关于这个主题的想法,所以我很高兴知道真正的原因是什么。

所以我的建议和其他评论一样:尝试在完成矩阵后立即释放矩阵。存储许多密集阵列的可能性不是很多:一个大的阵列(这里不推荐,因为Matlab使其连续,将更快地到达内存),单元阵列或结构阵列(如果我正确理解文档,开销可以相当)。在所有情况下,所有4D阵列上的数据量都非常大,因此最好的做法是通过在使用数据后丢弃一些数据来尽可能地保持内存尽可能低,并且只保留内存中的计算结果(如果它们占用较少的内存......)。