2016-02-17 114 views
0

我正在Matlab中使用非常计算的扩展代码。它需要使用优化技术和使用非常大矩阵的长计算。Matlab中的内存问题:.mat中的更新变量

我遇到了以下问题:即使代码正确运行,在代码所需的迭代结束时,Matlab也不会存储我拥有的最大单元阵列。我想这是由于我的代码或计算机中的某些内存效率低下(这可能不够强大)。但是,我遵循Matlab文档中的所有一般建议,但仍然无法正常工作。

使用evalc,我设法为每次迭代的代码保存一个不同的变量,以便在循环结束时重新创建原始矩阵。然而,使用:

  1. evalc(strcat('var_',mat2str(i),'= varTmp'));
  2. evalc(strcat('save(var_',mat2str(i),'--append)'));
  3. 明确VAR *

。在这种方式中,工作,但它仍然缓慢,不是很“干净整洁”。

有没有办法以更好的方式做同样的事情(考虑到我必须对具有不同名称和维度的多个变量做同样的事情),或者更新.mat文件中的单元格数组,添加一个列(行或其他)没有加载它?

感谢

+0

[不要使用'eval'。永远。](http://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170) – Adriaan

+0

我很想避免它,任何想法做它? – merch

+0

在前面的陈述中不那么强烈:使用'eval'几乎总是一个糟糕的主意。链接的帖子告诉你为什么:效率不好,代码可读性差,可能危险。在这种情况下,您可以完全避免使用“eval”,请参阅Daniel的答案。 – Adriaan

回答

3

使用matfile它允许你写入和读出的垫子文件的部分,而无需将其读入内存中。小演示:

%initialize matfile 
data=matfile('example.mat','writable',true) 
n=10 
%preallocate cell 
data.list=cell(n,1) 
for ix=1:n 
    %do some stuff 
    var=foo(n) 
    %store the results 
    data.list(3,1)={var} 
end 

线data.list(3,1)={var}看上去有些奇怪,因为matfile建立索引时,有一定的局限性,但它的“意义”是data.list{3}=var

+0

非常感谢,我认为这是我正在寻找的答案。我只需要一些澄清。使用matfile,我将在现有的(??)mat文件中写入一个新的/现有的(??)单元格数组,而不在工作空间中(或者只有一个指向matfile的指针,而没有变量的副本?)。这是对的吗? – merch

+0

如果'example.mat'已经存在,它将被扩展,否则它将被创建。 Matfile被设计为与不适合内存的文件一起工作。 – Daniel