C#與Matlab混合編程的幾種方式
主要參考資料: 《Matlab C# Book》,我看的是第一版的電子書,網上可以搜到。
說實話,我覺得C#與Matlab混合編程相比VC與Matlab混合編程沒有啥優勢,基本上還是通過P/V
Invoke操作Matlab mcc編譯器產生的C語言版本的DLL。此外,速度上也慢的嚇人-_-
下面簡單寫寫C#與Matlab混合編程的4種方式(可能還不夠全,歡迎補充):
1. 通過從Matlab的*.m檔案中產生C語言版本的DLL
具體過程:
1)
在Matlab中寫好一個m檔案(比如一個簡單的加法函數myplus.m);
2) 使用Matlab的mbuild
-setup選擇編譯器,我機器上的編譯器有兩個LCC和VC2008(注意如果使用VS.net做應用的話,建議編譯器選VC2008,否則C#中會告訴你DLL找不到Entry
Point)
3) 在命令列中使用mcc -B csharedlib:mypluslib myplus.m
(如果是多個M檔案,接著往後寫),等待幾十秒之後會產生若干檔案(*.c, *.h, *.dll等), 其中.h檔案中有匯出的函數原型。
4) 建立C#工程,並將前面的dll拷貝到合適路徑,使用[ DllImport(
"mypluslib.dll ", CallingConvention = CallingConvention.Cdecl)]
將.h檔案中的函數使用C#的文法聲明。一般來說,這些函數中會有**Initialize,**Terminate和M檔案中定義的函數(**代表lib名稱)。
5) 使用CsharpMatlabCompilerVer4.cs將C#中的資料類型和Matlab中的矩陣等類型進行變換。該檔案定義了MatlabCSharp類,主要是匯入了libmx.dll中的一些函數,並封裝了一些實用的函數如double2mxArray_scalarReal等。
2. C#調用Matlab工作區計算並返回結果
主要使用engOpen, engClose, engPutVariable,
engEvalString, engGetVariable函數進行操作。
大致過程如下:
MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);
MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);
MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" );
mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );
3. 使用Matlab DeployTool產生COM組件
注: 老版本的叫ComTool,現在叫做DeployTool。在Command
Window裡面直接輸入deploytool即可
1) 選擇New Deployment Project -> MATLAB
Builder NE -> Generic COM Component
2) 添加相應的M檔案
3) 儲存,編譯
4) 建立C#工程,添加Reference, Ok
4. 使用Matlab DeployTool產生.Net組件
1) 選擇New Deployment Project -> MATLAB
Builder NE -> .Net Component
2) 添加相應的M檔案
3) 儲存,編譯
4) 建立C#工程,由於經常要
using MathWorks.MATLAB.NET.Arrays;
using
MathWorks.MATLAB.NET.Utility;
因此需添加MWArray這個Reference,一般安裝玩MATLAB Builder
NE就有了,放在GAC當中的。
暫時就知道這麼多~