2011-09-11 12 views
4

私はC++コードから生成されたMEXを呼び出すMatlabコードを持っています。 C++コードでは、初期化時に大量のメモリ割り当てと計算が必要です。 スタティックポインタを使用すると、初期化は最初の呼び出しでのみ行われ、後続の呼び出しではポインタが読み取られます。どのように重複の初期化を避けるには、(matlabのコンパイルされたコード)の?

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

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

おかげで、 レオ

+1

まだ問題を把握しましたか?あなたが問題を再現する短いサンプルコードを出すことができないのであれば? – jmlopez

+0

関連する質問:[複数の機能を持つクラスオブジェクトへのMATLAB MEXインターフェイス](http://stackoverflow.com/questions/1182183/matlab-mex-interface-to-a-class-object-with-multiple-functions)(受け入れられた答えをチェックしてください) – Amro

答えて

1

優秀な質問です。これを2つの異なるmex関数、つまり初期化を計算してその結果を返す関数と関数を返す関数に分解しなければならないかもしれません。その後

[heavyCompResults,otherHeavyResults] = initComputation(initParams); 

performComputation(compParams,heavyCompResults,otherHeavyResults); 

代わりに、あなたは、MATLABを通すのではなく、ファイルに物事を書くことができます。その後

initComputation(initParams,initResultsFname); %writes initResultsFname 

performComputation(compParams,initResultsFname); %reads initResultsFname 

つ以上の代替:

は、DLLにコードを作成し、loadLibrary function in Matlabを使用しています。そうすれば、静的なものを作成するときには、おそらく呼び出す間にメモリに残ります。しかし、私はこれを確認していません。

0

あなたの問題をまだ解決しているかどうかはわかりませんが、私に役立つ情報がいくつかあります。

これは私が持っていた問題と似ています。同じ関数の新しいバージョン(メモリアクセスの問題があった場所)をコンパイルすると、mex関数の古いバージョンが実際にメモリを残していないことがわかりました。私は、(おそらく)mexファイルのファイル名がのを使って、matlabのメモリからmex関数をクリアすることを含む、たくさんのことを試みました。私が見つけた同じ欠陥のあるmex関数への繰り返しアクセスを防ぐ唯一の成功した方法は、matlabを再起動することでした。これにより、メモリの問題が毎回修正されました。この場合と解決策は正確にあなたの問題と一致しませんが、私の提案は、matlabを再起動することです。希望が役立ちます。

関連する問題