【问题标题】:Memory issue with Matlab: update variable in .matMatlab 的内存问题:更新 .mat 中的变量
【发布时间】:2016-02-17 11:00:44
【问题描述】:

我正在使用 Matlab 中的计算量非常大的代码。它需要使用优化技术和使用非常大的矩阵进行长时间计算。

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

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

  1. evalc(strcat('var_', mat2str(i), '=varTmp'));
  2. evalc(strcat('save(var_', mat2str(i), '-append)'));
  3. 清除变量*

.. 以这种方式运行,但它仍然很慢,而且不是很“干净整洁”。

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

谢谢

【问题讨论】:

  • 我很想避免它,有什么想法吗?
  • 在前面的陈述中不那么强烈:使用eval 几乎总是一个坏主意。链接的帖子向您展示了原因:效率低下,代码可读性差,并且可能很危险。在这种情况下,您可以完全避免 eval,请参阅 Daniel 的回答。

标签: matlab memory mat-file


【解决方案1】:

使用matfile,它允许您写入和读取mat 文件的部分内容,而无需将其读入内存。一个小示范:

%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

【讨论】:

  • 非常感谢,我想这就是我一直在寻找的答案。我只是需要一些澄清。使用 matfile,我将在现有的 (??) mat 文件中写入一个新的/现有的 (??) 单元数组,而不会在我的工作区中使用它(或者只有一个指向 matfile 的指针,而没有变量的副本?)。对吗?
  • 如果example.mat已经存在,它将被扩展,否则将被创建。 Matfile 旨在处理不适合内存的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2015-05-27
  • 2020-05-08
  • 2019-05-12
  • 2023-04-03
相关资源
最近更新 更多