4

MATLAB Coder の出力を Visual Studio 2010 の C# プロジェクトに統合したいと考えています。私の主なアイデアは次のとおりです。

  • Matlab で *.m スクリプトを作成する
  • スクリプトが Matlab Coder と互換性があることを確認してください。
  • Matlab Coder で C++ 共有ライブラリ (DLL) を生成する
  • 次のようなものを使用して C# と統合します。

    //Starts the model execution. May take several minutes
    public static class DllHelper
    {
        [DllImport(@"test.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint = "Run()")]
        public static extern int Run();
    }
    
  • また、実行を停止して部分的な結果を取得できるようにしたいと考えています。これを行うために、私は 2 つの方法を考えていましたStopExecutionRetrievePartialResults

    [DllImport(@"test.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint =     "StopExecution ()")]
    public static extern int StopExecution ();
    
    [DllImport(@"test.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint = "RetrievePartialResults()")]
    public static extern MyResults RetrievePartialResults();
    

することは可能ですか?いいえの場合、代替手段はありますか?はいの場合、どこで他の例を見つけることができますか?

4

5 に答える 5

3

あなたの計画がうまくいくかどうかはわかりませんが、MATLAB Builder NE が代わりになるかもしれません。m-code に対する厳しい制限なしに、.Net dll を直接出力します。

欠点は、ターゲット マシンで MCR が必要になることです。

于 2013-10-16T21:11:54.237 に答える
3

私は両方の方法を行いました。以前は、私たちのプロジェクトは MATLAB Compiler を使用していましたが、現在は Coder に切り替えました。これは、ランタイムをインストールする必要があるというオーバーヘッドを回避するためです (明らかな理由もなく、プロセス内で起動に失敗することがよくありました)。

コーダー出力を C インターフェイスを使用してアンマネージ C プロジェクトとしてコンパイルし、C++/CLR プロジェクトをラッパーとして使用します。これには、コンパイラがヘッダー ファイルを直接読み取るため、P/Invoke のインターフェイスを手動で指定する必要がないという利点があります。C++/CLR アセンブリは、コードが使用される C# プロジェクトにリンクされています。これはコストがかかることに注意してください。そのため、matlab コードをタイトなループで呼び出すことは避け、可能であればループ全体をライブラリに移動することをお勧めします。

これはラッパー ライブラリのスニペットです (まだ古い Managed C++ 構文を使用していますが、ここでは関係ありません)。

bool CTurconConnect2::Init()
{
      // Call the exported function in the library. Imported using a header file. 
      turcon_initialize();
      // Call one of the matlab functions (in this case, the entry function is manually defined 
      // in the C library, to have a clean interface)
      SetParameters(36.0,400.0,20.0,30.0,15.0,40.0,110.0, 0.0, 100.0);
      return true;
}

bool CTurconConnect2::Exit()
{
      turcon_terminate();
      return true;
}
于 2013-10-22T06:21:09.577 に答える
2

DLL を作成して c# から呼び出すというあなたの計画は、2 つの主な方法の 1 つだと思います。

別の方法は次のとおりです。

com オートメーション経由でエンジン インターフェイスを使用して、C# から MATLAB をオートメーション サーバーとして使用します。これにより、C# 側と MATLAB 側の両方でデバッガーを使用して、C# アプリケーションを同時にデバッグできます。

以下に両方の方法の例と、3 番目の代替方法 (あまりお勧めできません) を示します。

File Exchange での MATLAB と C# の統合

于 2013-10-17T10:04:08.627 に答える
1

したがって、リスト形式では、

  1. 必要に応じて呼び出すことができる複数の関数に分割しない限り、matlab コードを停止できるとは思えません。
  2. スレッドを呼び出して必要に応じてスレッドを停止することで実行を停止できるようにするか、スレッドが停止するようにシグナルを送信して、関数間で中止することをお勧めします (部分的な結果の目的で)。
  3. そのmatlabは、項目1の要件を満たすにはひどい言語です(私自身、これまでに良い経験をしたことはありません)
于 2013-10-22T20:27:59.727 に答える