2013-02-23 49 views
1

我跑這有幾個嵌套循環的MATLAB腳本,和我被告知要預先分配一些我的矢量和陣列。Matlab的預分配與SimBiology對象

我已經能夠找到如何,比如說,細胞或雙打做到這一點,但我有困難找出如何預先分配的其他數據類型的數組。

具體而言,我使用含有SimBiology對象矢量和數組。

因此,我們有:

  • allModels爲100個SimBiology模型

    矢量
  • resultsData作爲SIMDATA的矢量

  • allResults作爲amxn SIMDATA矩陣

我認爲所有這些都可以從中受益預分配 - 目前我看到在運行腳本時,我的內存使用量急劇增加,可能是由於重新分配和內存碎片,並且釋放的內存沒有被清理/有效地返回到操作系統。

我是很新的MATLAB,所以我道歉,如果答案應該是顯而易見的,或者如果我沒有給予足夠的信息...感謝您的幫助!

乾杯

回答

3

我給你在某一時刻的一些預分配的技巧,但我首先要指出的是,您的內存使用情況更可能是由於保留在內存中,直至退出MATLAB SimBiology模型。 SimBiology車型表現相當不同於細胞或雙打在幾個重要的方面:「值對象」

  1. SimBiology模型「處理對象」,而不是您可以在MATLAB文檔中閱讀關於handle and value objects的更多信息,但這裏的關鍵是多個變量可以同時指向相同的內存中SimBiology模型。
  2. SimBiology模型保留在內存中,直到它們被明確刪除。您可以使用功能sbioroot訪問所有內存中的SimBiology模型。要從存儲器中刪除SimBiology模型,您必須調用delete方法,例如, delete(modelObj)。如果您想立即刪除全部 SimBiology模型,您可以調用功能sbioreset(但請謹慎使用此功能!)。

現在,預分配。一個"reversed for loop"是你可以預先分配任何數據類型(而無需學習每種數據類型的特定功能)的一種方式。這個想法是利用MATLAB的自動數組分配的方式,最初以最大的大小分配數組。這是一個愚蠢的例子,使得2第5個權力的載體:

for ind = 5:-1:1 
    squares(ind) = ind^2; 
end 

我說這是一個愚蠢的例子,因爲它會在MATLAB來更好地實現爲(1:5)^2。儘管如此,我希望它能得到反向循環分配的想法。

對於您使用SimBiology的特殊情況,您需要將SimBiology模型的顯式刪除和循環的反轉組合在一起。您的代碼可能是這個樣子:

% Note the reverse for loop below 
for modelIndex = 100:-1:1 
    % First, load the model 
    % Option 1: Load your models from a list of SBML files stored in sbmlFileNames 
    allModels(modelIndex) = sbmlimport(sbmlFileNames{modelIndex}) 
    % Option 2: Load your models from a list of sbproj files stored in projFileNames 
    loadedProject = sbioloadproject(projFileNames{modelIndex}); 
    allModels(modelIndex) = loadedProject.m1; 
    % Option 3: Explicitly create your model 
    allModels(modelIndex) = sbiomodel(['Model ' num2str(modelIndex)]); 
    % Of course, you'll need to customize each model somehow 

    % Store a "baseline" simulation of each in resultsData 
    resultsData(modelIndex) = sbiosimulate(allModels(modelIndex)); 

    % Now create the matrix of SimData 
    % Note the reverse for loop below 
    for variantIndex = 20:-1:1 
    % Setup for the modified simulation. 
    % One option: Use some previously defined variant objects stored in variantList 
    allResults(modelIndex, variantIndex) = ... 
     sbiosimulate(allModels(modelIndex), variantList(variantIndex)); 
    end 
end 

% Once you are done, delete SimBiology models to free memory 
delete(allModels) 

而且隨時聯繫MathWorks的技術支持,如果您有其他問題。 (我的SimBiology的開發商之一,我總是很高興有機會聽到我們的用戶在做,並設法讓生活更容易爲他們。)

-Arthur