asp.net matlab,ASP.NET与MATLAB混合编译以及数据传递【更新中】
本帖最后由 yinbo20081314 于 2015-5-20 00:35 編輯
在VS環(huán)境的項(xiàng)目中,首先需要引用以下dll才能開啟MATLAB混編。【引用1】MatlabApplication(Version 8.1) Type Library 1.0
a1.jpg (42.85 KB, 下載次數(shù): 9)
2015-5-20 00:16 上傳
【引用2】
在MATLAB安裝地址下可以找到MWArry.dll:
MATLAB\R2013a\toolbox\dotnetbuilder\bin\win32\v2.0
【在程序環(huán)境中添加命名空間】
Using MLApp;??//引用1中使用
Using MathWorks;??//引用1中使用
Using MathWorks.MATLAB; //引用1中使用
UsingMathWorks.MATLAB.NET.Arrays; //引用2中使用
Using MathWorks.MATLAB.NET.Utility; //引用2中使用
方法1是混合編程的方式,我用32位系統(tǒng)的matlab2013a+VS2013可以成功實(shí)現(xiàn),其他配置可以參考MATLAB的官網(wǎng)介紹,下邊也會(huì)說到。引用1的方法能夠直接在C#環(huán)境下將MATLAB命令傳遞給MATLAB,并且將結(jié)果返回。如果要做一個(gè)在線MATLAB控制平臺(tái),倒是可以考慮這個(gè)方法。但是引用1也有巨大的局限性,那就是無法調(diào)用自定義的function。方法2與方法1剛好相反,能夠?qū)⒆约壕帉懙腇UNCTION編譯成C#直接調(diào)用的類來使用。
【MATLAB準(zhǔn)備工作】安裝MATLAB編譯器要到MATLAB安裝路徑下找到toolbox\compiler\deploy\win32,安裝“MCRInstaller.exe”就好。不同版本的MATLAB有他相對應(yīng)的編譯器,一定要保證程序與此編譯器的版本一致。
【使用方法1】
需要在【引用1】的前提下進(jìn)行
Using MLApp;??//引用1
Using MathWorks;??//引用1
Using MathWorks.MATLAB; //引用1復(fù)制代碼
例1:
MLApp.MLAppClass matlab = new MLApp.MLAppClass();
String command=”這里填寫MATLAB執(zhí)行語言”;
string state_ddu=matlab.Execute(command);
matlab.Quit();
matlab = null;
Label2.Text = state_ddu;復(fù)制代碼
例2:
MLApp.MLAppClass matlab = new MLApp.MLAppClass();
string command = @"M=imread('C:\Users\Administrator\Desktop\aaa.jpg');" +
@"N=imread('C:\Users\Administrator\Desktop\bbb.jpg');" +
"I=rgb2gray(M); " +
"J=rgb2gray(N);" +
"[Count1,x]=imhist(I);" +
"[Count2,x]=imhist(J);" +
"Sum1=sum(Count1);" +
"Sum2=sum(Count2);" +
"Sumup = sqrt(Count1.*Count2);" +
"SumDown = sqrt(Sum1*Sum2);" +
"Sumup = sum(Sumup);" +
"HistDist=1-sqrt(1-Sumup/SumDown);" +
"HistDist";
string state_ddu = matlab.Execute(command);
matlab.Quit();
matlab = null;
Label2.Text = state_ddu;復(fù)制代碼
例3:
MLApp.DIMLApp matlab = null;
Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");
matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.DIMLApp;
matlab.Visible = 1;
matlab.Execute("figure(2)");復(fù)制代碼
例4:
MLApp.MLApp matlab = null;
Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");
matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.MLApp;
matlab.Visible = 1;
string command = "figure(3)";
matlab.Execute(command);復(fù)制代碼
例5:
MLApp.MLApp O_matlab = new MLApp.MLApp();
O_matlab.Visible = 0;
string command1, command2;
command1 = "t=0:0.01:2*pi;y=sin(t);h=plot(t,y)";//matlab腳本命令行
command2 = @"figure(1)";
O_matlab.Execute(command1);
O_matlab.Execute(command2);? ?? ???// 執(zhí)行Matlab命令
O_matlab.Quit();復(fù)制代碼
評價(jià):MLApp的使用特點(diǎn)就是直接生成MATLABAPP類,調(diào)用內(nèi)部函數(shù)進(jìn)行計(jì)算,并且將計(jì)算結(jié)果利用execute事件返回。缺點(diǎn)是暫時(shí)無法實(shí)現(xiàn)自定義函數(shù)的使用。目前不可以帶有自定義函數(shù)的代碼存在。
【使用方法2】
這個(gè)方法的最大特點(diǎn)就是可以將函數(shù)function編譯成類,供VS直接調(diào)用。
準(zhǔn)備):一般應(yīng)該是MATLAB版本比VS高,從而使得MATLAB可以支持VS的使用,具體的匹配可以詳見下面的mathwork鏈接:
MathWorks中關(guān)于軟件編譯支持的軟件
http://cn.mathworks.com/support/compilers/R2013a/index.html
http://cn.mathworks.com/support/compilers/R2015a/?s_cid=srchtitle
如果版本安裝匹配,在MATLAB會(huì)找到VS編譯器,如果不合適是不會(huì)找到VS編譯器的。
這里介紹的是C#環(huán)境下的編譯,因此步驟1可以省略。
步驟1)(C#下非必需):>>mbuild-setup
a2.jpg (39.89 KB, 下載次數(shù): 18)
2015-5-20 00:17 上傳
步驟2):
準(zhǔn)備好自己的function,下面以makeSqr(n)為例
function out=makeSqr(n)
out=magic(n);
end復(fù)制代碼
步驟3):
>>deploytool復(fù)制代碼
如圖所示輸入工程名稱為Demo,target選擇.NETAssembly
a3.jpg (31.09 KB, 下載次數(shù): 25)
2015-5-20 00:20 上傳
步驟4):
命名一個(gè)類MLTestClass,添加M文件makeSqr.m。
a4.jpg (40.43 KB, 下載次數(shù): 22)
2015-5-20 00:20 上傳
如果需要可以在setting中修改命名空間名稱,使得命名空間與工程名稱相互區(qū)分;其他的設(shè)置功能可自行設(shè)置。
a5.jpg (53.31 KB, 下載次數(shù): 16)
2015-5-20 00:21 上傳
完成之后,點(diǎn)擊build進(jìn)行編譯。若編譯成功會(huì)如下顯示。
a6.png (40.23 KB, 下載次數(shù): 22)
2015-5-20 00:22 上傳
在生成的demo/distrib中會(huì)有4個(gè)文件,我們需要用到demo.dll。其中demoNative.dll和demo.dll是功能一致的,有網(wǎng)友實(shí)驗(yàn)說demoNative.dll會(huì)比demo.dll塊一點(diǎn),我測試過覺得也就快一點(diǎn)點(diǎn),具體哪里的區(qū)別有待繼續(xù)學(xué)習(xí)。Demo_overview.html算是使用說明,與【引用2】所述是一樣的。
a7.png (159.4 KB, 下載次數(shù): 18)
2015-5-20 00:23 上傳
步驟5):打開一個(gè)web網(wǎng)站,利用【引用2】中的提示添加引用MWArray.dll。再添加編譯好的demo.dll,如圖所示:
a8.png (86.21 KB, 下載次數(shù): 17)
2015-5-20 00:23 上傳
在命名空間中輸入
using com.demo;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;復(fù)制代碼
觸發(fā)程序中輸入:
MLTestClass obj = null;
MWNumericArray input = null;
MWNumericArray output = null;
MWArray[] result = null;
try
{
obj = new MLTestClass();
input = 5;
result = obj.makeSqr(1, input);
output = (MWNumericArray)result[0];
}
catch (Exception)
{
throw;//需要修改
}復(fù)制代碼
步驟6):
Output并不是簡單的結(jié)果,其中包含了關(guān)于結(jié)果的全部信息。如果output是一個(gè)矩陣,需要toarray()將其進(jìn)行轉(zhuǎn)換為數(shù)組。另一個(gè)例子:
double[,] myResult = (double[,])output.ToArray();
EXenergy1.Text = Convert.ToString(myResult[0, 0]);復(fù)制代碼
注意):
MATLAB矩陣A與C#數(shù)組myResult[,]一一對應(yīng),只要注意下下標(biāo)即可。
A=[1,2,3,4;
5,6,7,8];
myResult[0,0]=1;
myResult[1,3]=8;
總結(jié)
以上是生活随笔為你收集整理的asp.net matlab,ASP.NET与MATLAB混合编译以及数据传递【更新中】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改内核的启动logo
- 下一篇: 块设备驱动介绍