最近在做一個asp.net網站程序,有個需求是利用離散點生成等高線,一開始研究了半天如何生成等高線的思想,後來感覺太麻煩了,想試着用matlab做一下。基本思想是:先在matlab裏寫好m文件,裏面包括一個函數。然後將m文件編譯成dll庫供後臺調用,思想很簡單,但有些設置比較麻煩,應該是操作系統或matlab軟件本身版本的問題,記錄以下:
1、開發工具:vs2010+ matlab 2012;
2、安裝matlab(注意版本問題,之前裝了matlab2010,但是隻是調試過程中是可行的,發佈成網站之後調用matlab生成的dll就不工作了,找了半天沒找到原因,後來試着裝了一個新版本matlab 2012,好了)
3、安裝MCRInstaller.exe(路徑:D:\Program Files\MATLAB\R2012b\toolbox\compiler\deploy\win32)
4、設置環境變量:我的電腦-屬性-高級-環境變量-系統變量-PATH-編輯,在變量值輸入框中,不要刪除以前的字符串,在最前面加入MCR的安裝路徑,如:"D:\Program Files\MATLAB\MATLAB Compiler Runtime\v80\bin\win32;" 然後確定、保存、重啓電腦。(我就是不知道需要這兩步,老是在C#創建Matlab的訪問對象時,出現:“xxx的類型初始值設定項引發異常。”,完全不理解是什麼原因,被耽擱了大量時間,直到安裝了Matlab 2008b,仔細閱讀它生成的readme.txt才知道)
5、設置matlab編譯環境。在matlab的Command window中輸入mbuild -setup顯示如下
>> mbuild -setup
6、編寫m文件
7、在matlab中調用deploytool 命令編譯m文件,生成動態鏈接庫dll
8、在vs工程中引用生成的dll,同時還要加載MWArray.dll鏈接庫
9、引用matlab文件及核心代碼,注意matlab的傳值參數類型,Cont爲生成的dll鏈接庫,CCont爲類名。
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using Cont;
....
CCont myC = new CCont();
MWStructArray res = (MWStructArray)myC.Contour((MWNumericArray)x11, (MWNumericArray)x21, (MWNumericArray)y11, (MWNumericArray)y21,
(MWNumericArray)x_num1, (MWNumericArray)y_num1, (MWNumericArray)zArr.ToArray());
10、OK!
應用matlab第一次加載時運行還是比較慢的,但計算確實比較方便。在運行的時候可以利用多線程或ajax技術,提高用戶界面友好性。