C# 調用 Matlab

來源:互聯網
上載者:User

標籤:

Matlab是很豐富的一個資源,我在一個曝光機項目的一個演算法中用到了Matlab的函數,在VS的不斷升級過程中以及Matlab的各個版本變化,導致了我經常困惑了,這裡還沒有提到作業系統,32位還是64位。

下面我先介紹下我的環境:

windows8.1 64bit, Matlab 7.11.0(R2010b)-64bit,VS2012,vs2008

搭建好環境後,第一步先建立一個M函數, 我這裡建立兩個M檔案,分別儲存為函數名稱multiply.m, makesquare.m檔案。

function z = multiply(x,y)
z = x * y;

function y = makesquare(x)
y = magic(x);

 

1.1)建立Deploy tools

  

1.2) 建立工程名字,這裡叫做TestCSharpCallMatlab,並選擇產生.NET Assembly,路徑可以更換。

1.3)添加一個類(DemoTest),並為這個類添加兩個m檔案。

  

1.4)點擊右邊的設定,選擇要產生的.NET Framework的版本,我這裡最高只有.NET3.5,就選擇3.5.

  在其他對話方塊裡面還可以進行一些設定,這裡就不介紹了。

1.5)點擊編譯按鈕,就開始編譯了,等待編譯完成。

    

 

1.6)編譯完成後,就產生了2個檔案夾,其中distrib裡面就有我們想要調用的dll了,具體裡面什麼內容,我們查看附件就可以了。

    

 

我們產生完動態連結程式庫以後,就要如何調用了,下面我先直接使用VS2008來進行調用(匹配.NET 3.5),

建立一個winform程式,引用兩個庫,一個是MWArray(C:\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0),一個是產生的dll(C:\Program Files\MATLAB\R2010b\bin\TestCSharpCallMatlab\distrib\TestCSharpCallMatlab.dll).

然後using設定:

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

這裡設定兩個按鈕調用2個函數,然後把結果顯示在文字框中,代碼如下:

 1         private void button1_Click(object sender, EventArgs e) 2         { 3             try 4             { 5                 DemoTest test = new DemoTest(); 6                 int[] offset = {2}; 7                 int[] ppp ={3}; 8                 MWArray a = new MWNumericArray(1,1,offset); 9                 MWArray b = new MWNumericArray(1,1,ppp);10                 MWNumericArray results = (MWNumericArray)test.multiply(a, b);11                 textBox1.Text = string.Format("2 * 3 = {0}", (int)results[1]);12                 13             }14             catch (Exception ex)15             {16 17                 MessageBox.Show(ex.Message);18             }19         }20 21         private void button2_Click(object sender, EventArgs e)22         {23             try24             {25                 DemoTest test = new DemoTest();26                 int[] offset = {3};27                 MWArray a = new MWNumericArray(1,1,offset);28                 MWNumericArray results = (MWNumericArray)test.makesquare(a);29                 StringBuilder sb = new StringBuilder();30                 sb.AppendLine(string.Format("{0}, {1}, {2}", results[1], results[2], results[3]));31                 sb.AppendLine(string.Format("{0}, {1}, {2}", results[4], results[5], results[6]));32                 sb.AppendLine(string.Format("{0}, {1}, {2}", results[7], results[8], results[9]));33                 textBox2.Text = sb.ToString();34             }35             catch (Exception ex)36             {37                 MessageBox.Show(ex.Message);38             }39 40         }
View Code

這裡要注意的就是類型的轉換,以前我因為轉換問題,出現過too many output arguments的錯誤。
最終顯示結果如下:

 

在這裡,VS的設定為any cpu即可。VS2008的Demo代碼連結如下:

http://files.cnblogs.com/files/monkeyZhong/TestCSharpCallMatlabApplication2008.zip

 http://files.cnblogs.com/files/monkeyZhong/TestCSharpCallMatlab.zip

但是VS2012就容易出現問題,歸根結底就是要修改VS2012的目標框架為.NET Framework3.5,這樣才會正確,

否則就會出現這樣的錯誤:已停止工作。

當然C#調用Matlab的方法不止這一種,還有幾種其他的方法,這裡就不在這裡說了。

 

C# 調用 Matlab

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.