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