【问题标题】:Matlab preallocation with SimBiology objectsMatlab 预分配与 SimBiology 对象
【发布时间】:2013-02-23 16:23:12
【问题描述】:

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

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

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

所以我们有:

  • allModels 作为 100 个 SimBiology 模型的向量

  • resultsData 作为 SimData 的向量

  • 所有结果为 m x n SimData 矩阵

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

我是 matlab 的新手,所以如果答案很明显,或者我没有提供足够的信息,我深表歉意......感谢您的帮助!

干杯

【问题讨论】:

    标签: matlab


    【解决方案1】:

    稍后我会为您提供一些预分配技巧,但我首先要指出的是,您的内存使用更有可能是由于 SimBiology 模型在您退出 MATLAB 之前一直保留在内存中。 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。尽管如此,我希望它能够理解使用反向 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 的开发人员之一,我总是很高兴有机会听到我们的用户在做什么,并找到让他们的生活更轻松的方法。)

    -亚瑟

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2021-04-09
      相关资源
      最近更新 更多