0 引言
目前,Matlab廣泛的應用于自動控制、數學運算、信號分析、圖像處理、財務分析等各行各業。MATLAB也存在著某些缺點:Matlab是一種解釋性語言,其特點是以矩陣為基本數據結構,導致其執行效率相對C或C+ +語言要低很多;因為Matlab程序不能脫離其環境運行,故不能直接用于商用軟件的開發。與此相反,VC++由于其豐富得人機界面,高效的執行效率已經成為基于Windows平臺下開發商業軟件的必備工具。然而,VC++對于復雜的數值運算就有點“力不從心”了。所以將VC++與Matlab完美的結合,發揮各自的優勢具有現實意義。自Matlab6.5版本開始,新推出來的Combuilder支持把用Matlab編寫的程序做成com組件,供其他語言調用。該方法實現簡單,通用性強,成為VC與Matlab混合編程最有效的方法。
1 VC與Matlab混合編程的方法
1.1 通過Matlab Engine方式
Matlab Engine是指一組Matlab提供的接口函數,支持C語言, Matlab Engine采用C/S(客戶機/服務器)模式,Matlab作為后臺服務器,而C程序作為前臺客戶機,通過Windows的動態控件與服務器通信,向Matlab Engine傳遞命令和數據信息,從Matlab Engine接受數據信息。用戶可以在前臺應用程序中調用這些接口函數,實現對Matlab Engine的控制。采用這種方法幾乎能利用Matlab全部功能,但是需要在機器上安裝Matlab軟件,而且執行效率低,因此在實際應用中不采用這種方法,在軟件開發中也不可行,這種模式只適合個人使用或做演示。
1.2 直接調用Matlab的C/C++數學函數庫
Matlab中提供了可以供C/C++語言調用的C/C++數學函數庫,其中包含了大量用C/C++語言重新編寫的Matlab數學函數,這些函數涉及到線形代數、數值分析、傅立葉變換、多項式計算、解微分方程等,并且函數庫中提供了大量各種矩陣操作函數,在VC中可以直接使用這些函數,通過這些函數可以在VC中方便的實現在Matlab中矩陣運算功能。用這種方法可以很靈活的調用Matlab來編寫應用程序,但要求讀者對C/C++語言非常熟悉,并且這種模式不能包括所有的Matlab函數,尤其是無法充分使用Matlab提供的詳盡的繪圖函數。
1.3 用Matlab自帶的Matlab Compiler
Matlab Compiler的作用是將m文件轉化成C/C++代碼(也就是通常所用的mcc命令),這種源代碼需要用C/C++編譯器編譯連接成獨立應用程序,在將m文件轉成獨立應用程序的過程中生成的C/C++文件,原則上是可以被其它的C/C++代碼調用的,編譯器可以通過設置mcc命令的選項,將m文件編譯成動態鏈接庫文件、C/C++文件、可執行文件等一系列文件。到matlab R21.1為止,Matlab Compiler的m程序轉換成C/C++代碼功能有很多限制:
⑴不能轉換腳本m文件,只能轉換m函數;
⑵不能使用matlab對象;
⑶不能用input或者eval操作matlab空間變量;
⑷不能動態地命名變量,然后用load或者save命令來操作;
⑸不能處理具有嵌套調用其他m文件的m文件;
⑹不能使用MATLAB內聯函數;
1.4 使用matcom工具
這是第三方控件,很小(8M多),原本屬于mathtool公司,后來被Mathworks公司合并了,使用該工具可以將m腳本文件和m函數轉化成相同功能的C/C++文件,相比其它方法使用matcom具有如下優點:
⑴轉換過程簡單(由matcom工具自動實現),容易實現;
⑵可以方便的生成動態鏈接庫文件(dll)和可執行文件(exe);
⑶不僅可以轉換獨立的腳本文件,也可以轉換嵌套腳本文件;
⑷設置環境后,可以使用Matlab的工具箱函數;
但matcom也有以下不足:
⑴對struct等類的支持有缺陷,對class數據類型;
⑵部分繪圖語句無法實現或得不到準確圖象,尤其是三維圖象;
⑶當涉及到的復雜函數調用時嵌套的文件數量很多。
因此在不涉及到三維做圖以及m文件不大的情況下推薦使用。
1.5 使用Matlab的Combuilde工具
COM是component object module的簡稱,它是一種通用的對象接口,任何語言只要按照這種接口標準,就可以實現調用它。Matlab6.5新推出來的Combuilder就是把用Matlab編寫的程序做成com組件,供其他語言調用。該方法實現簡單,通用性強,而且幾乎可以使用Matlab的任何函數(注意:不支持腳本文件,腳本文件使用時要改為函數文件),因此在程序較大、調用工具箱函數或調用函數較多時推薦使用,這也是Matlab公司推薦的使用方法。
2 基于COM接口的Matlab與VC混合編程實現FFT轉換
2.1 創建Matlab源文件
在Matlab中實現FFT轉換只需要一個函數即可。
(1) 新建M文件,在M文件中輸入以下兩條語句:
Function FFT(X,Y) %實現FFT轉換。函數名為FFT,x為輸入參數,y為輸出參數
Y=fft(X); %fft轉換實現函數
(2)保存為FFT.m 的M文件。
2.2 在Matlab下創建COM組建
(1)在matlab command window輸入如下命令:
>>comtool
(2)出現com編輯界面后,選擇File->New Project建立新工程testfft,并將FFT.m加入到新建工程中。
(3)點擊Build->COM Object…生成COM組件。
至此com組件已經由matlab做好,默認的保存位置為:matlab安裝位置\work\component。
2.3 VC下調用COM組件
(1)將testfft_idl.h 和testfft_idl_i.c文件拷貝到VC建立的工程目錄下。兩文件默認目錄為\work\component\src
(2)將目錄/extern/include/下的mwcomtypes.h文件拷貝的VC建立的目錄下。
(3)將上面三個文件加入VC工程:工程->添加工程->Files,選擇剛剛拷到目錄下的testfft_idl.h 和testfft_idl_i.c文件。
(4) 為程序添加頭文件testfft_idl.h 、testfft_idl_i.c和mwcomtypes.h
(5)填寫調用COM組件代碼:
if(FAILED(CoInitialize(NULL))) //初始化調用com
{
AfxMessageBox("unable to initialize COM");
}
Itestfft *st=NULL;
HRESULT hr=CoCreateInstance(CLSID_testfft,NULL,CLSCTX_ALL,IID_Itestfft,(void **)&st);
if(SUCCEEDED(hr))
{
VARIANT x,y;
VariantInit(&x);
VariantInit(&y);
x.vt=VT_I4;
x.lVal=4;
st->fte(x,y); //x為輸入參數,y為輸出參數
st->Release();
}
else
{
AfxMessageBox("unsucceed");
}
至此實現VC下調用COM組件實現FFT轉換。
3 結論
實踐表明用COM方法實現VC與Matlab混合編程具有實現簡單、執行效率高、幾乎支持所有的matlab函數、易移植等優點。
posted on 2007-06-11 12:59
星夢情緣 閱讀(4225)
評論(8) 編輯 收藏 引用 所屬分類:
關于編程