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



All Articles