如果這些文章對你有用,有幫助,期待更多開源元件介紹,請不要吝啬手中的滑鼠。
關鍵詞:Matlab混合程式設計,C#調用Matlab,Matlab與C#混編,MCR,Type-Safe Interfaces
時間:2013年4月21日,5月5日例子Demo測試成功
Matlab Builder NE 工具箱是與C#混編的工具箱,裡面的幫助文檔很詳細,提供了4種情況下與.NET混合程式設計的案例。
1.是簡單的元件內建,通過Matlab生成Dll程式集,在.NET環境中,通過MWArray元件來調用;
2.還有一個是在Web環境下使用Figure和混編的情況,與1比較類似;
3.另外一個就是我們今天要講到的基于類型安全的接口程式設計,以及對WCF和MEF的支援;
4.最後一個是在.NET Remoting技術中的使用。
在初級入門教程中,以及我現在的混編開發中,都隻是用到了第1個方法,和很簡單,也很快,當然要你掌握了很多基礎技術之後才能達到這個水準。今天要見到的基于接口的程式設計,有一個很大的好處就是可以避免類型轉換,因為之前的方法都有大量的.NET和Matlab類型進行轉換,基礎不紮實的朋友很容易搞混淆。而基于接口的程式設計,則可以避免很多問題,但同時也對基礎提出了更高的要求,要對接口定義,作用,以及方法多态等面向對象的特性更加了解。
下面截圖是在Matlab幫助的說明:

與直接編譯為.NET程式集的要求不同,使用這項技術對.NET程式員的要求小很多,隻需要很少的Matlab知識,但要對.NET技術精通,
之前由于Matlab的資料類型和.NET的基本資料類型不相容,是以為了使得Matlab和.NET程式進行資料通信,就需要使用下面的技術:
1)Marshal data from .NET input data to a deployed function by creating an MWArray object from native .NET data.
The public functions in a deployed component return MWArray objects.
2)Marshal the output MATLAB data in an MWArray into native .NET data by calling one of the MWArray marshaling methods (ToArray(), for example).
是以使用傳統的混編方式,又很多資料類型轉換的過程。而在使用Type-Safe Interfaces技術後,這些中間過程都可以忽略,
隻需要關系輸入的.NET類型以及輸出的.NET類型結果,Matlab會對資料進行内部的轉換處理。可以看看前後2副圖的對比:
是以,我們可以很明顯的看到Type-Safe Interfaces帶來的優勢:
You avoid training and coding costs associated with teaching end users to work with MWArrays.
You minimize cost of data you must marshal by either placing MWArray objects in type-safe interfaces or by calling MWArray-based functions in the deployed component.
Flexibility — you mix type-safe interfaces with manual data marshaling to accommodate data of varying sizes and access patterns.
For example, you may have a few large data objects (images, for example) that would incur excess cost to your organization if managed
with a type-safe interface. By mixing type-safe interfaces and manual marshaling, smaller data types can be managed
automatically with the type-safe interface and your large data can be managed on an as-needed basis.
對這個混編方式,很顯示可以節省很多事情,我認為,作為原始的資料類型轉換方式,還是應該掌握的。在掌握了之後,再使用這個方法,會事半功倍,畢竟不是所有的問題都可以用接口解決。接下來,就讓我們一起用一個小的程式設計執行個體,來示範整個過程的使用。
示範環境:Visual Studio 2010,Matlab 2012a,.NET 4.0
示範内容:一個簡單的乘法運算混編實作
一、建立一個 類庫類型的項目 ,名稱MatlabDemo,.NET 4.0,如下圖所示:
一、在上面的項目中添加一個接口檔案IMultiply.cs,并編寫下面的代碼,因為我們實作的是一個簡單的乘法,是以添加如下幾個接口方法:
這裡注意,一定要将接口的可通路性設定為Public,否則混編的時候,Matlab會找不到接口原型,編譯失敗。編寫好,編譯項目即可,會在bin檔案夾下得到MatlabDemo.dll檔案,這個檔案下面的步驟會用到。
三、編寫M函數,并設定混編項目。我們編寫一個簡單的乘法M函數m,如下所示:
注意這裡的名稱一定要和接口方法的名稱對于起來,否則Matlab怎麼會認識,想想就明白了。然後在Matlab中輸入deploytool指令,輸入項目名稱:TypeSaftDemo,并選擇項目類型:.NET Assembly,這個過程是“混編三部曲”基本過程,以前的視訊中專門見到了,不仔細說明,如下圖所示:
确定之後,混編項目基本就建立了,然後建立一個類DemoTest,并把上面編寫的multiply.m函數添加到這個類中去,這其實就是一個正常的混編過程,很簡單。添加完成之後,如果是普通的混編方式,直接編譯就可以了,但基于接口的混編方式,還有一個過程要設定,看下圖,單擊混編項目的設定(Settings...):
如下圖,打開設定後,選擇“Type Safe API”頁籤:
首先,選擇我們在第一個過程中編寫好的MatlabDemo.dll接口檔案,選擇後,程式會自動搜尋該dll中的可用接口(公開的),在.NET interface下拉清單中顯示,選擇你需要的,這裡我們是IMultiply,如下圖所示的MatlabDemo.IMultiply,然後選擇該接口和Matlab混程式設計式中對于的類,我們的multiply.m函數在DemoTest類中,如下圖的Wrapped class:
設定完成之後,關閉即可。然後編譯,如果沒有問題,提示編譯成功之後,打開編譯好的檔案夾,我們可以看到如下3個dll檔案:
生成的3個檔案,TypeSafeDemo.dll其實和普通的混編方式是一樣的,可以和以前資料類型轉換的方式一樣使用;而DemoTestIMultiply.dll和TypeSafeDemoNative.dll這2個一起使用,Matlab已經在内部将資料轉換過程封裝好了,直接使用即可。第一種方式就不示範了,直接示範如何用接口來計算乘法。
五、C#調用混編好的dll計算結果。在上一節中我們已經說明了幾個dll的作用,下面将示範他們的用法,将DemoTestIMultiply.dll和TypeSafeDemoNative.dll一起複制到測試項目的C#項目中去(建立一個控制台測試項目),分别添加這幾個dll的引用:MWAarray.dll和DemoTestIMultiply.dll以及TypeSafeDemoNative.dll。然後添加命名空間,具體核心代碼如下所示:
結果如下圖所示:
上面就是Matlab和C#基于接口的混合程式設計的詳細過程,混編是一個很有用的工具,但要用好,其實真的很難,接觸混編這麼長的時間以來,碰到過很多同學使用這個工具,絕大部分是誤用,導緻無故的工作量。要想混編成為自己工作和學習的得力助手,必須加強Matlab和.NET基礎的學習,隻有2者的基礎掌握好了,足夠熟悉這2個平台,你才可能更順利的解決混編過程中遇到的問題。當混編出了問題的時候,需要很多經驗才能度過難關,這一點很重要,不要指望學會這個過程,就可以解決所有問題。期待Mathworks公司對Matlab的混編程式設計支援越來越強大。
1 Matlab Builder NE具箱的User’s Guide欄目中的Type-Safe Interfaces, WCF, and MEF
2 Loren Shure 部落格: