暑假參加比賽時開發的winform程序里用到了matlab生成的dll,現在來總結一下具體過程。
我的開發環境是Visual Studio 2008和Matlab 2011
操作步驟:
1、matlab中安裝MCR
MCR是MATLAB程序的運行底層支持,它打包了MATLAB運行所必需的支持全部庫、組件,就像使用Visual Studio.net 發布的程序必須安裝Frame框架一樣。如果想在其他電腦上運行matlab文件,但是又沒有安裝matlab,則安裝MCR這個matlab的運行環境即可。
MCR不用自己下載,如果你已經安裝了matlab,在你安裝目錄中找MATLAB7\toolbox\compiler\deploy\win32 ,里面點擊MCRInstall 按提示安裝即可。
2、安裝matlab編譯器
安裝完MCR后,打開你的matlab,在命令窗口中輸入命令 mbuild-setup,設置編譯器,在設置過程中會出現選擇編譯器的提示
我電腦帶有的編譯器是 Microsoft Visual C++ 2008 SP1
因此選擇1即可,系統將自動安裝。
3、運行deploytool,編譯.net dll
寫好你在matlab中的程序,我以一個簡單的畫圖程序為例,程序內容是根據輸入數組A的數據,畫出直方圖,其中數組A(0)代表一班人數、A(1)代表二班人數依次類推。代碼如下。
function test(A) t=[1,2,3,4,5,6]; bar(t,A) set(gca,'XTickLabel',{'一班','二班','三班','四班','五班','六班'}) ; set(gca,'xtick',1:6); str=[num2str(A')]; text(t,A,cellstr(str))
編寫成M文件后,在matlab命令窗口輸入命令deploytool,在彈出的窗口中輸入項目名、地址和編譯類型,我們選擇的是.NET Assembly
點擊確認后出現以下窗口
我們在編譯前要設置一下,點擊中的Settings
設置.NET,設置如上圖,選擇microsoft framwork版本時一定要選單前使用版本,不能選 default,要不然編譯出來的會有一點問題。將Assembly Type 設置為Shared點擊Close回到編譯窗口。
在編譯窗口中,Add Class 為設置類名,Add File選擇你的M文件,即編譯后在C#的類函數。設定完后點擊編譯即可。編譯結束后會在 test\src下會產生test.dll,這就是我們需求的 dll文件。
4.打開VS建立C#項目,導入dll引用
如何導入dll引用?只需要對着自己的項目點右鍵,在右鍵菜單中點擊添加引用即可。注意,除了導入剛才自己生成的dll引用,你還需導入一個名為MWArray.dll的引用,他是matlab自帶的引用,你可以在[Matlab安裝位置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夾中找到。
添加完引用,當然不要忘了在類里using啦!在類開頭寫上
1 using MathWorks.MATLAB.NET.Arrays; 2 using MathWorks.MATLAB.NET.Utility; 3 using test;
5.C#編碼
在C#編碼中,我們調用matlab編寫的dll的類時,輸入與輸出返回的數據類型都為MWArray,那么這個MWArray類型如何和C#中的數據類型進行交互呢?我們要先學習下面的知識
matlab中的數據與c#中數據的傳遞
我們先了解一下MWNumericArray,它是MWArray與C#中數據傳遞的中間類。怎么用?怎樣在C#與matlab間傳遞參數?
a.double型、int型等數值類型的變量傳遞
MWNumericArray i = null, result = mydouble; i=4; myClass myclass = new myClass(); //實例化 result = (MWNumericArray)myclass.myfunc(i);
只要result轉換成MWNumericArray類,那么就好辦了,利用C#的轉換類型函數就能轉換成C#中的其他類型了,如Convert.ToDouble()一下就變成Double類型了。
b.字符串(需要用到MWCharArray和MWArray轉換)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName);
c.多個輸出參數組成的數組
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一個參數返回的數組(matlab返回的數組下界是從1開始的)
取出數組中的一個元素值
mydouble=out_Arr[i].ToScalarDouble();
如上面例子ToScalarDouble一類的toXXXX等方法還有許多。
d.result.toArray可以把matlab返回的矩陣變成C#的n*m數組,eg:
double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real);
e.將數組傳入Matlab(和傳遞單個數值的方法一樣)
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } }; MWNumericArray x=dbx; myclass.picture(x);
這樣針對你對數據類型的要求進行相應的轉換,就能在c#中調用matlab的dll來進行計算了。當然,如果你的c#程序發布出來后,要在其他電腦上運行,那么這台電腦除了要裝.net環境還要裝MCR環境。
參考文章:http://wenku.baidu.com/view/a20207e919e8b8f67c1cb982.html