我給你在某一時刻的一些預分配的技巧,但我首先要指出的是,您的內存使用情況更可能是由於保留在內存中,直至退出MATLAB SimBiology模型。 SimBiology車型表現相當不同於細胞或雙打在幾個重要的方面:「值對象」
- SimBiology模型「處理對象」,而不是您可以在MATLAB文檔中閱讀關於handle and value objects的更多信息,但這裏的關鍵是多個變量可以同時指向相同的內存中SimBiology模型。
- 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