4

C++ コードから生成された MEX を呼び出す Matlab コードがあります。C++ コードは、初期化時に大量のメモリ割り当てと計算を必要とします。静的ポインターを使用すると、初期化は最初の呼び出しでのみ行われ、ポインターは後続の呼び出しで読み取られます。

この Matlab コードが Matlab Compiler を使用してコンパイルされるまで、すべてが正常に機能していました。静的ポインターが無効なメモリを参照しているように見えるため、MEX への後続の呼び出し (現在は matlab コンパイル コード内で発生) がクラッシュします。

この場合、初期化の重複を避けるにはどうすればよいでしょうか?

ありがとう、レオ

4

2 に答える 2

1

素晴らしい質問です。これを 2 つの異なる mex 関数に分割する必要がある場合があります。1 つは初期化を計算してその結果を返し、もう 1 つは関数を実行します。

  [heavyCompResults,otherHeavyResults] = initComputation(initParams);

それで:

  performComputation(compParams,heavyCompResults,otherHeavyResults);

または、Matlab を介して渡す代わりに、ファイルに書き出すこともできます。

  initComputation(initParams,initResultsFname);  %writes initResultsFname

それで:

  performComputation(compParams,initResultsFname); %reads initResultsFname

もう1つの選択肢:

コードを DLL にしloadLibrary、Matlab で関数を使用します。そうすれば、静的を作成すると、おそらく呼び出し間でメモリにとどまるはずです。しかし、私はこれを確認していません。

于 2011-10-07T23:12:06.727 に答える
0

問題が解決したかどうかはわかりませんが、参考になった関連情報をいくつかご紹介します。

これは、私が抱えていた問題に似ているようです。同じ関数の新しいバージョン (メモリ アクセスの問題があった) をコンパイルすると、古いバージョンの mex 関数が実際にはメモリから離れないことがわかりました。(おそらく) clear mex-file-nameを使用して matlab メモリから mex 関数をクリアするなど、さまざまなことを試しました。私が見つけた同じ欠陥のある mex 関数への繰り返しアクセスを防ぐ唯一の成功した方法は、matlab を再起動することでした。これにより、毎回メモリの問題が修正されました。このケースと解決策はあなたの問題と完全には一致しません、matlab を再起動することをお勧めします。それが役立つことを願っています。

于 2012-06-24T06:53:27.640 に答える