C#.NETでのMATLABの統合

エントリー


この記事では、MATLABをC#.NETに接続し、3Dプレーンを構築する例を使用して、インターフェイスを備えたアプリケーションを作成する方法を、順を追って説明します。

なぜこれが必要なのですか?


多くの場合、プログラマは複雑な数学を計算するタスクに直面します。 一方、MATLABは解決に優れたツールですが、本格的なカスタムアプリケーションを作成するのは苦手です(MATLABのGUIツールを使用できますが、それは私には不向きです)。

ツール


  1. Microsoft Visual Studio 2008 SP1
  2. MATLAB 2010a
  3. MATLABコンポーネントランタイム


ステップ1.リンカーのセットアップ


C#.NETに統合するためのMATLAB dllライブラリをビルドするには、リンカーを構成する必要があります。 プロジェクトを収集する環境。 最初に、MCRランタイム(MATLABコンポーネントランタイム)をインストールする必要があります。 これは、MATLAB言語を完全にサポートするdllライブラリのセットです。 インストールファイルは次の場所にあります。... \ MATLAB \ R2011b \ toolbox \ compiler \ deploy \ win32 \ MCRInstaller。 標準インストール、次へをクリックします。
MATLABコマンドウィンドウでリンカーを構成するには、 mbuild -setupと入力しmbuild -setup 。 すべてに同意し、必要な環境を選択します。この場合はMVS 2008 SP1です。 同様の結果が得られます。

Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n? y

Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2010a\sys\lcc
[2] Microsoft Visual C++ 2008 SP1 in C:\Program Files\Microsoft Visual Studio 9.0

[0] None

Compiler: 2

Please verify your choices:

Compiler: Microsoft Visual C++ 2008 SP1
Location: C:\Program Files\Microsoft Visual Studio 9.0

Are these correct [y]/n? y


私たちはうれしそうなDoneを取得Doneます。 すべて-リンカーは構成されています。

ステップ2. m関数を書く


与えられた境界条件で3D平面を構築する関数を書きます;興味を引くために、関数記述子を返します。

function res=plane(strfunc,vx0,vx1,vy0,vy1,h)
vx=vx0:h:vx1;
vy=vy0:h:vy1;
figure(1)
res=ezsurfc(strfunc,vx,vy);
end


ご覧のとおり、関数は6行のコードで構成されていますが、上記のすべてのアクションを実行します。シンボル関数( strfunc )、平面境界ベクトルの初期値と最終値(v x0,vx1,vy0,vy1 )、グリッドステップ( h )、記述子( res )を返します。
このコードをplane.mとして保存します。

重要: MATLABコンパイラーは関数のみを理解します。つまり、各スクリプトはfunction始まり(好ましくはendでend )、個別のmファイルである必要があります。

ステップ3.動的ライブラリーを入手する


コマンドウィンドウにMATLAB'a deploytool入力します。 新しい.NETアセンブリプロジェクトMATLABplaneを作成し、場所を指定します。

画像

次に、planeClassクラスを作成し、plane.mを追加して、ビルドボタンをクリックします

画像

コンパイルが成功すると、興味のあるMATLABplane.dllライブラリが作成されます。ここにあります:... MATLABplane \ distrib \ MATLABplane.dll。

ステップ4. C#.NETアプリケーションを作成する


MVS 2008 SP1では、C#でWindowsフォームアプリケーションを作成します。

ライブラリリンクを追加する

プロジェクトメソッドを使用する前に、コンパイルされたMATLABplane.dllライブラリとMWArray.dllライブラリへのリンクを追加する必要があります。\ MATLAB \ R2010a \ toolbox \ dotnetbuilder \ bin \ win32 \ v2.0にあります。 追加すると、次のようになります。

画像

プロジェクトでライブラリを使用するには、名前空間の説明を追加する必要があります。

using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using MATLABplane;

フォームを作成する

デザイナーのツールバーを使用して、将来のアプリケーションのフォームを作成します。

画像

次のブロックを使用してフォームを作成しました:Label、TextBox、RichBox、Button。

コードを書く

プログラミング言語C#とMATLABの相互作用のために、MATLAB型に対応するMWArray C#データ型が作成されました。 MWArrayは配列の配列であり、変数、スカラー、ベクトル、行列、行、構造体、オブジェクトなどで構成できます。 MWArrayから値を取得するには、型キャストを使用する必要があります。
アプリケーション操作アルゴリズムは次のようになります。
  1. シンボリック形式の関数とテキストフィールドからの値の取得
  2. planeClassクラスからplaneメソッドを呼び出す
  3. 記述子出力配列の取得(タイプMWNumericArray)
  4. RichBoxの出力記述子配列

以下にコメント付きの完全なコードを示します。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.Arrays; using MATLABplane; namespace planeApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += new EventHandler(button1_Click);//  button2.Click += new EventHandler(button2_Click); } double x0, x1, y0, y1, h; //  string func, s_x0, s_x1, s_y0, s_y1, s_h; MWArray[] res = null; //   plane MWNumericArray descriptor = null; //   private void button1_Click(object sender, EventArgs e)// { try { func = textBox1.Text; //  TextBox s_x0 = textBox2.Text; s_x1 = textBox3.Text; s_y0 = textBox4.Text; s_y1 = textBox5.Text; s_h = textBox6.Text; MWCharArray mw_func = new MWCharArray(func);//     MWCharArray x0 = Convert.ToDouble(s_x0); // string  double x1 = Convert.ToDouble(s_x1); y0 = Convert.ToDouble(s_y0); y1 = Convert.ToDouble(s_y1); h = Convert.ToDouble(s_h); planeClass obj_plane = new planeClass(); //   res = obj_plane.plane(1, mw_func, x0, x1, y0, y1, h);//   plane,   -  -   descriptor = (MWNumericArray)res[0]; //     MWArray      MWNumericArray double[,] d_descriptor = (double[,])descriptor.ToArray(MWArrayComponent.Real);//  MWNUmericArray    double for (int i = 0; i < d_descriptor.Length; i++)//  d_descriptor  RichBox { richTextBox1.Text += i.ToString() + '\t'; richTextBox1.Text += d_descriptor[i, 0].ToString("0.000") + '\n';//   double  string } } catch (Exception ex)//  { System.Windows.Forms.MessageBox.Show(ex.Message); } } private void button2_Click(object sender, EventArgs e) { richTextBox1.Text = string.Empty;// RichBox res = null;//  descriptor = null; } } } 


ご覧のとおり、MWArray-> MWNUmericArray-> type C#のスキームに従って、型キャストが積極的に使用されています。
プロジェクトをコンパイルして結果を確認します。

画像

文学


  1. MATLAB。 Visual C#プログラミング、Borland JBuilder、VBA-N.K. Smolentsev
  2. C#と.NETプラットフォーム-E. Troelsen

Source: https://habr.com/ru/post/J132487/


All Articles