我稍后会给您一些预分配技巧,但我首先要指出,您的内存使用更有可能是由于 SimBiology 模型在您退出 MATLAB 之前一直保留在内存中。SimBiology 模型在以下几个重要方面表现与细胞或双胞胎完全不同:
- SimBiology 模型是“处理对象”而不是“值对象”。您可以在 MATLAB 文档中阅读有关句柄和值对象的更多信息,但这里的关键点是多个变量可以同时引用同一个内存中 SimBiology 模型。
- SimBiology 模型会一直保留在内存中,直到被明确删除。您始终可以使用函数sbioroot访问所有内存中的 SimBiology 模型。要从内存中删除 SimBiology 模型,您必须调用该
delete
方法,例如delete(modelObj)
. 如果您想一次删除所有SimBiology 模型,您可以调用该函数sbioreset
(但请谨慎使用此函数!)。
现在,进行预分配。“反向 for 循环”是一种可以预先分配任何数据类型的方法(无需为每种数据类型学习特定函数)。这个想法是利用 MATLAB 的自动数组分配,以一种最初分配最大大小的数组的方式。这是一个愚蠢的例子,它制作了 2 的前 5 个幂的向量:
for ind = 5:-1:1
squares(ind) = ind^2;
end
我说这是一个愚蠢的例子,因为它最好在 MATLAB 中实现为(1:5)^2
. 尽管如此,我希望它能够理解使用反向 for 循环进行分配的想法。
对于您使用 SimBiology 的特殊情况,您需要结合显式删除 SimBiology 模型和反向 for 循环。您的代码可能如下所示:
% 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 的开发人员之一,我总是很高兴有机会听到我们的用户在做什么,并找到让他们的生活更轻松的方法。)
-亚瑟