4

Engine C API を介して Matlab と通信する C++ コードがいくつかあります。私のコードは、Matlab ワークスペースに一時変数を作成し、clearできるだけ早く呼び出しを介して入念にクリーンアップします。ただし、ある時点で、アプリケーションが失敗し、次の Matlab 一時変数を作成できないことが通知されます (通常、このような操作が ~65530 回行われた後)。

Matlab コマンド ラインでいくつかの実験を行った後、純粋な Matlab でこの問題を再現できることを発見しました (つまり、C++ コードとエンジン API の使用に関係なく)。次のコードを検討してください。

for i = 1 : 100000
  eval(sprintf('x_%d = %d', i, i));
  whos
  eval(sprintf('clear x_%d', i));
  whos
end

Matlab R2008B (古い、私が知っている) を搭載した 32 ビット Windows ラップトップでこのコードを実行すると、ループは最終的にエラー メッセージで中止されます。

現在のワークスペースにはすでに変数が多すぎます。「x_65532」の余地はありません。

したがって、少なくともこの廃止されたバージョンの Matlab には、64K のシンボル テーブル制限があるようです。おそらく、Matlab の新しい (64 ビット) バージョンでは制限が大きくなっています。

ただし、より興味深い問題は、clear呼び出しがどのような影響を与えているか、およびその奇妙な動作を回避する方法です。以下は、中止の少し前の反復からの出力です。

x_65530 =

       65530

  Name         Size            Bytes  Class     Attributes

  i            1x1                 8  double              
  x_65530      1x1                 8  double              

  Name      Size            Bytes  Class     Attributes

  i         1x1                 8  double              

ご覧のとおりwhos、前の反復からの一時オブジェクトがワークスペースから削除されたことを出力が明確に示しており、クリアは期待どおりに機能しているように見えます。それにもかかわらず、シンボル テーブルは明らかに容量に達しています。

それで、SO忠実な人への2つの質問:

  1. このやや恣意的な制限を回避するにはどうすればよいですか? つまり、私のclear呼び出しを何に置き換える必要がありますか?
  2. この動作は、Matlab の新しいバージョンや 64 ビット バージョンで変更されましたか?
4

4 に答える 4

2

2) に対する答えは、この制限が古い Matlab バージョンに適用されるということです。には制限が存在しますがR2014b、 にはもう存在しませんR2015b

于 2016-08-27T09:58:07.507 に答える
1

ポイントは、matlab ではそれほど多くの変数を持つ必要がないということです。多くの変数ではなく、より大きな変数を使用してください。

それぞれxがスカラーの場合: ベクトルを使用

それぞれxが同じサイズの場合: 行列を使用

それぞれxが異なる場合は、セル配列を使用してください。

あなたと一緒x{65530} = magic(3)にいると、限界に近づくことはありません。

于 2013-12-02T14:31:18.500 に答える