2

ネストされたループがいくつかある MatLab スクリプトを実行しており、ベクトルと配列の一部を事前に割り当てるように指示されています。

たとえば、セルやダブルに対してこれを行う方法を見つけることができましたが、他のデータ型に配列を事前に割り当てる方法を見つけるのに苦労しています。

具体的には、SimBiology オブジェクトを含むベクトルと配列を使用しています。

したがって、次のようになります。

  • 100 個の SimBiology モデルのベクトルとしての allModels

  • SimData のベクトルとしての resultsData

  • amxn SimData 行列としての allResults

これらはすべて事前割り当ての恩恵を受ける可能性があると思います.現在、おそらく再割り当てとメモリの断片化が原因で、スクリプトを実行するとメモリ使用量が劇的に増加し、解放されたメモリがクリーンアップ/OSに返されないことがわかります.

私はmatlabを初めて使用するので、答えが明らかな場合、または十分な情報を提供していない場合はお詫び申し上げます...助けてくれてありがとう!

乾杯

4

1 に答える 1

4

すぐに事前割り当てのヒントをいくつか紹介しますが、最初に指摘しておきたいのは、MATLAB を終了するまで SimBiology モデルがメモリ内に残っているため、メモリ使用量が増加する可能性が高いということです。SimBiology モデルは、次のいくつかの重要な点で、セルまたはダブルスとはかなり異なる動作をします。

  1. SimBiology モデルは、「値オブジェクト」ではなく「ハンドル オブジェクト」です。ハンドル オブジェクトと値オブジェクトの詳細については、MATLAB ドキュメンテーションを参照してください。ただし、ここで重要な点は、複数の変数が同じインメモリ SimBiology モデルを同時に参照できることです。
  2. SimBiology モデルは、明示的に削除されるまでメモリに残ります。関数sbiorootを使用して、メモリ内のすべての SimBiology モデルにいつでもアクセスできます。SimBiology モデルをメモリから削除するには、deleteメソッドを呼び出す必要がありますdelete(modelObj)すべてのSimBiology モデルを一度に削除したい場合は、関数を呼び出すだけですsbioreset(ただし、この関数は注意して使用してください!)。

では、事前割り当てに進みます。「反転 for ループ」は、任意のデータ型を事前に割り当てる方法の 1 つです(データ型ごとに特定の関数を学習する必要はありません)。アイデアは、MATLAB の自動配列割り当てを利用して、最初に配列を最大サイズで割り当てることです。以下は、2 の最初の 5 乗のベクトルを作成するばかげた例です。

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

これはばかげた例だと思います。MATLAB で(1:5)^2. とはいえ、reverse 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 の開発者の 1 人です。ユーザーが何をしているかを聞いて、彼らの生活を楽にする方法を見つける機会をいつも感謝しています。)

-アーサー

于 2013-02-24T15:11:17.920 に答える