2

私の修士論文の一部として、次のような力要素として機能するために、MBS ソフトウェアの外部 C サブルーチンをプログラミングしています。

force=subfunction(displacement)

これを行う Matlab コードがあり、C で実装するには非常に時間がかかります。

したがって、これを克服するために私が考えた次のオプションが最も効率的な方法です。

1. Matlab-Compiler を使用して .exe を作成し、C から起動する

とても素敵で簡単な解決策。ただし、問題は、mbs-solver が関数を 10000 回以上呼び出し、コンパイルされた Matlab 実行可能ファイルが毎回 MCR (Matlab Compiler Runtime) をロードする必要があることです! 処理時間は非常に短い(~0.001 秒)ですが、MCR の読み込みには各反復ステップで約5 秒 (!)かかります。これにより、残念ながらこのオプションは役に立たなくなります。

http://www.mathworks.de/support/solutions/en/data/1-1ARNS/

「コンパイルされた実行可能ファイルを起動するたびに、基本的に MATLAB の別のインスタンスを起動します。」

2. Matlab-Compiler を使用して共有ライブラリなどを作成します。

私はこれを試していません。私が調査した限りでは、これらのオプションについても、オプション 1 のように MCR をすべてのステップで開始する必要があることがわかりました。

3. Matlab-Coder を使用して C コードを生成する

私が時々試した限り、それは簡単なオプションではありません。生成されたコードは最適化する必要があります。それは本当に効率的でしょうか?

4. Matlab-Executable を閉じずに初回のみ起動し、ファイルを介して C コードを通信する

単なる構想: Matlab-Exe を起動したいと思います。最初の繰り返しステップで、「変位」を含むファイルを書きます。次に、新しい値が来たら、Matlab からファイルをミリ秒ごとにスキャンします。それを処理して別のファイルに書き込むと、ミリ秒ごとに結果ファイルをスキャンする C ルーチンが新しい値を見つけて動作し続けます。

これはより速く動作すると想像できますが、バグがなくなるまで実装するのは少し難しいです.


あなたの経験やアイデアについてのレポートに感謝します。

4

1 に答える 1

1

まだリストされていないいくつかのオプションを提供するには:

  • SAGEを使用すると、1 つのスクリプトからMATLAB と C コードの両方を呼び出すことができます。C コードをCythonでラップする必要があるかもしれませんが、これは非常に簡単です。技術的には、C から MATLAB を呼び出すのではなく、3 番目のスクリプトから MATLAB と C の両方を呼び出しますが、結果は同じになります。

  • MATLAB を非常によく似たNumpyスクリプトに変換したい場合は、Cython を使用して複雑なコードをコンパイルし、すべてを非常にきれいに統合することができます。私はこれらの翻訳を数回行いましたが、非常に簡単なプロセスです。

于 2013-09-05T22:42:12.440 に答える