使用SimBiology对象进行Matlab预分配

时间:2013-02-23 16:23:12

标签: matlab

我正在运行一个MatLab脚本,它有几个嵌套循环,并被告知要预先分配我的一些矢量和数组。

我已经能够找到如何为单元格或双精度执行此操作,但很难找到如何为其他数据类型预分配数组。

具体来说,我正在使用包含SimBiology对象的向量和数组。

所以我们有:

  • allModels作为100个SimBiology模型的载体

  • resultsData作为SimData的载体

  • allResults作为m x n SimData矩阵

我认为所有这些都可以从预分配中受益 - 目前我看到我的内存使用量大幅增加,因为我运行脚本,可能是由于重新分配和内存碎片,并且释放的内存未被清理/返回到操作系统有效。

我对matlab很新,所以如果答案显而易见,或者我没有提供足够的信息,我很抱歉...感谢您的帮助!

干杯

1 个答案:

答案 0 :(得分:3)

我稍后会给你一些预分配技巧,但我首先要指出你的内存使用率更可能是由于SimBiology模型留在内存中直到退出MATLAB。 SimBiology模型在几个重要方面的表现与细胞或双打完全不同:

  1. SimBiology模型是“处理对象”而不是“值对象”。您可以在MATLAB文档中阅读有关handle and value objects的更多信息,但这里的关键点是多个变量可以同时引用相同的内存中SimBiology模型。
  2. SimBiology模型会一直保留在内存中,直到它们被明确删除。您始终可以使用函数sbioroot访问所有内存中的SimBiology模型。要从内存中删除SimBiology模型,您必须调用delete方法,例如delete(modelObj)。如果您想一次删除所有 SimBiology模型,您只需调用函数sbioreset(但请谨慎使用此功能!)。
  3. 现在,预先分配。 "reversed for loop"是预分配任何数据类型的一种方式(无需为每种数据类型学习特定的函数)。我们的想法是利用MATLAB的自动数组分配,最初以最大大小分配数组。这是一个愚蠢的例子,它使得前5个幂的向量为2:

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

    我说这是一个愚蠢的例子,因为它在MATLAB中更好地实现为(1:5)^2。尽管如此,我希望它能够解决使用reverse for循环的问题。

    对于使用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