2016-02-17 67 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