標籤:
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