湯俊, 張磊,樓力律
(河海大學(xué) 機(jī)電工程學(xué)院,江蘇 常州 213022)
?
自編頭文件的C-MEX混合編程
湯俊, 張磊,樓力律
(河海大學(xué) 機(jī)電工程學(xué)院,江蘇 常州 213022)
摘要:當(dāng)使用MATLAB進(jìn)行大規(guī)模數(shù)據(jù)處理時(shí),一個(gè)工程中包含了多個(gè)程序,而且各程序需交叉調(diào)用多個(gè)子程序,這將導(dǎo)致程序執(zhí)行效率低下?;赩C與MATLAB的自編頭文件的C-MEX混合編程可以有效解決這一問題。該方法在C/C++中自編一個(gè)頭文件,聲明需要用到的所有算法實(shí)現(xiàn)函數(shù),并在另外的程序中編寫這些函數(shù)的代碼,通過mexFunction接口函數(shù)實(shí)現(xiàn)VC與MATLAB混合編程。
關(guān)鍵詞:C/C++;MATLAB;C-MEX;自編頭文件;混合編程
0引言
MATLAB在科學(xué)研究與工業(yè)技術(shù)開發(fā)方面有著極為廣泛的應(yīng)用,具有強(qiáng)大的矩陣運(yùn)算、數(shù)據(jù)處理和圖形顯示功能,其輸出結(jié)果可視化,編程效率極高,極少的代碼即可實(shí)現(xiàn)復(fù)雜的運(yùn)行。利用這一完整的數(shù)學(xué)平臺(tái),用戶可以快速實(shí)現(xiàn)十分復(fù)雜的功能,極大地提高了工程分析計(jì)算的效率。但與其他高級(jí)程序相比,Matlab 使用一種腳本語(yǔ)言,它的執(zhí)行是逐行解釋執(zhí)行的,也就是邊解釋邊執(zhí)行,執(zhí)行效率非常低,這就是常常看到的在開發(fā)一些復(fù)雜的算法時(shí),通常會(huì)發(fā)現(xiàn)程序執(zhí)行很慢[1]。
C/C++語(yǔ)言是目前最為流行的高級(jí)程序設(shè)計(jì)語(yǔ)言之一[2]。它的功能豐富、表達(dá)力強(qiáng)、使用靈活方便、應(yīng)用面廣、目標(biāo)程序高、可植入性好,適合作為系統(tǒng)描述語(yǔ)言,既可以用來編寫系統(tǒng)軟件,也可以用來編寫應(yīng)用軟件。在工程實(shí)踐中,用戶使用MATLAB進(jìn)行大規(guī)模數(shù)據(jù)處理時(shí),會(huì)碰到復(fù)雜的循環(huán)語(yǔ)句程序,以及多程序調(diào)用多算法函數(shù)的情況。MATLAB往往由于執(zhí)行效率的問題而顯得力不從心,這時(shí)可以使用C/C++語(yǔ)言進(jìn)行算法的設(shè)計(jì),然后在MATLAB環(huán)境中調(diào)用,從而大大提高數(shù)據(jù)處理的效率[3]。在C/C++與MATLAB混合編程過程中,使用C-MEX文件是一種常用的方法。本文基于MATLAB7.0和VC6.0開發(fā)環(huán)境,自編聲明算法實(shí)現(xiàn)函數(shù)的頭文件,在接口函數(shù)mexFunction()程序中包含該頭文件,實(shí)現(xiàn)C-MEX的混合編程。
1MEX文件的環(huán)境配置
實(shí)現(xiàn)MEX文件的編寫與編譯首先需要對(duì)MEX編譯器進(jìn)行配置,生成配置文件[1]。對(duì)MATLAB編譯應(yīng)用程序mex的配置命令為:
>>mex -setup
然后按系統(tǒng)提示進(jìn)行選擇,本文選擇Microsoft Visual C++ 6.0作為編輯器。
2MATLAB調(diào)用自編頭文件的MEX文件
所謂MEX是MATLAB Executable的縮寫,它是一種“可在Matlab 中調(diào)用C(或Fortran)語(yǔ)言的衍生程序”[4]。C語(yǔ)言MEX文件的源程序主要由兩個(gè)截然不同的部分組成,分別用于完成不同任務(wù)。第一部分稱為計(jì)算程序,它包含了所有實(shí)際需要完成計(jì)算功能的源代碼,用來完成實(shí)際的計(jì)算工作,即用戶以前所編寫的算法和程序;第二部分稱為入口子程序,它是計(jì)算子程序同MATLAB環(huán)境之間的接口,用來完成兩者之間的通信任務(wù)。它定義被MATLAB調(diào)用外部子程序的入口地址,MATLAB系統(tǒng)向子程序傳遞的子程序參數(shù)、子程序向MATLAB系統(tǒng)返回的結(jié)果參數(shù),以及調(diào)用計(jì)算功能子程序等[1]。MEX源文件的兩個(gè)組成部分既可以存放在一個(gè)文件中,也可以分為兩個(gè)文件來存放。
當(dāng)MEX源文件的計(jì)算程序和入口子程序分開存放時(shí),即算法實(shí)現(xiàn)函數(shù)和接口函數(shù)mexFunction()分別在兩個(gè)程序中,這時(shí)可以自編一個(gè)頭文件,聲明該算法實(shí)現(xiàn)函數(shù),然后在新的程序中定義算法實(shí)現(xiàn)函數(shù)。注意編寫的入口子程序必須包含自編的頭文件。主要實(shí)現(xiàn)步驟如下:
1) VC6.0的編譯環(huán)境設(shè)置。添加相應(yīng)的頭文件的路徑:打開菜單【Tools:Options...】選擇”Directories”選項(xiàng)卡。在”Show Directories for”組合框中選取”Include files”,添加”D:PROGRAM FILESMATLABR2010AEXTERNINCLUDE”;添加相應(yīng)的庫(kù)文件的路徑:在”Show Directories for”中選取”Library files”添加”D:PROGRAM FILESMATLABR2010AEXTERNLIBWIN32MICROSOFT”;注意根據(jù)用戶MATLAB安裝位置,修改相應(yīng)目錄。
2) 創(chuàng)建工程,并在工程中添加入口子程序和計(jì)算程序兩個(gè)C文件。
3) 在工程中添加聲明計(jì)算程序中定義的算法實(shí)現(xiàn)函數(shù)的自編頭文件。
4) 為工程添加DEF文件。
5) VC6.0的工程設(shè)置。添加需鏈接的庫(kù)文件:打開菜單【Project:Setting】選取”Link”選項(xiàng)卡,在”O(jiān)bject/Library Modules”里添加libmx.lib、libmat.lib、libmex.lib和libeng.lib;動(dòng)態(tài)庫(kù)調(diào)試程序路徑的設(shè)置:打開菜單【Project:Setting】選取”Debug”選項(xiàng)卡,在”Executable debug for session”中選擇matlab.exe作為調(diào)試程序。
6) 調(diào)試程序,生成可執(zhí)行mex文件。
3實(shí)例說明
下面通過一個(gè)簡(jiǎn)單的實(shí)例說明MATLAB如何調(diào)用含自編頭文件C/C++生成可執(zhí)行mex文件。
有一個(gè)用C語(yǔ)言寫的函數(shù),實(shí)現(xiàn)了一個(gè)功能,如一個(gè)簡(jiǎn)單的函數(shù):
double add(double x,double y)
{return x+y;}
通過C-MEX混合編程生成mex文件實(shí)現(xiàn)在MATLAB使用它,如輸入:
>>a=add(1.1,2.2)
a= 3.3000
mex文件實(shí)際上是一個(gè)特別的動(dòng)態(tài)鏈接庫(kù),輸出函數(shù)為mexFunction()。當(dāng)使用C-MEX混合編程時(shí),使用C/C++中的Win32 Dynamic Link Library、MFC APPWizard(DLL)靜態(tài)鏈接庫(kù)和擴(kuò)展MFC動(dòng)態(tài)鏈接庫(kù)創(chuàng)建MEX程序[3]。首先根據(jù)章節(jié)2的步驟1做好VC6.0編譯環(huán)境設(shè)置。這里新建一個(gè)MFC AppWizard(dll)工程,工程名為add,選擇使用靜態(tài)連接的MFC的DLL。在工程中添加入口子程序add.c、計(jì)算程序a.c、自編頭文件add.h。為了方便讀者閱讀,將主要程序代碼源代碼整理如下:
//add.c
/*add.c中存放入口子程序*/
#include"add.h"/*add.h頭文件中聲明
計(jì)算實(shí)現(xiàn)功能函數(shù)aad()*/
#include"mex.h"
void mexFunction(int nlhs,mxArray
*plhs[], int nrhs,const mxArray *prhs[])
/*實(shí)現(xiàn)接口功能*/
{
double *a;
double b, c;
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
a = mxGetPr(plhs[0]);
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
*a = add(b, c);
/*調(diào)用計(jì)算實(shí)現(xiàn)功能函數(shù)aad()*/}
//add.h
/*add.h中聲明計(jì)算實(shí)現(xiàn)功能函數(shù)add()*/
double add(double x,double y);
//a.c
/*a.c中存放計(jì)算實(shí)現(xiàn)函數(shù)代碼*/
#include”add.h”
#include”mex.h”
double add(double x,double y)
{
return x+y;
}
根據(jù)章節(jié)2的步驟5做好工程設(shè)置后,打開該工程DEF文件,并對(duì)其內(nèi)容進(jìn)行編輯,即在Exports后面添加一行”;mexFunction()”。按F5運(yùn)行程序調(diào)試,編譯連接通過后,MATLAB作為調(diào)試路徑自動(dòng)啟動(dòng)。在Command Window里輸入:
>>mex -v add.c a.c
成功生成add.mexw32,MATLAB便可以像調(diào)用m文件那樣直接調(diào)用該文件。在MATLAB的Command Window里輸入:
>> a=add(1.1,2.2)
a=3.3000
這與單獨(dú)使用C/C++編寫程序的運(yùn)行結(jié)果一致。上述實(shí)例中只含有一個(gè)子程序a.c。如果入口子程序需調(diào)用多個(gè)算法函數(shù),只需要在自編的頭文件add.h中聲明這些函數(shù),在新的子程序中編寫算法函數(shù)代碼。需要注意的是在MATLAB的Command Window里輸入的mex命令需包含主程序(入口程序)以及所有的子程序。
4結(jié)語(yǔ)
簡(jiǎn)單闡述了基于VC和MATLAB的自編頭文件的C-MEX混合編程方法,實(shí)現(xiàn)了兩種編程語(yǔ)言的無縫鏈接。對(duì)于多程序調(diào)用多個(gè)子程序的復(fù)雜情況,該方法可供工程人員進(jìn)行參考,方便編程,提高數(shù)據(jù)處理效率。
參考文獻(xiàn):
[1] 王素立, 高潔, 孫新德. MATLAB混合編程與工程應(yīng)用[M]. 北京:清華大學(xué)出版社, 2008.05.
[2] 錢能. C++程序設(shè)計(jì)教程[M]. 北京:清華大學(xué)出版社, 2005.
[3] 張亮,王繼陽(yáng). MATLAB與C/C++混合編程[M]. 北京:人民郵電出版社,2008.11.
[4] 董長(zhǎng)虹. Matlab接口技術(shù)與應(yīng)用[M]. 北京:國(guó)防工業(yè)出版社, 2004.
C-MEX Mixed Programming with Self-compiled Header File
TANG Jun, ZHANG Lei,LOU Li-lu
(School of Mechanical and Electrical Engineering,Hohai University,Changzhou 213022,China)
Abstract:For large-scale data processing in MATLAB, multiple programs exist in a project and each program needs to cross-call multiple subprograms,so the execution efficiency of the program is low.The C-MEX mixed progrmming method based on VC and MATLAB can be used to deal be with this problem very well.In this method,by writting a self-compiled header file to declare all the algorithm implementation functions whose codes can be written in other programs,and using mexFunction as a interface function,mixed programming of VC and MATLAB can be realized.
Keywords:C/C++;MATLAB;C-MEX;self-compiled header file;mixed programming
中圖分類號(hào):TP311
文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1671-5276(2015)02-0101-02
作者簡(jiǎn)介:湯俊(1986-),男,湖北黃岡人,碩士研究生,主要研究方向?yàn)榈葞缀畏治雠c結(jié)構(gòu)優(yōu)化設(shè)計(jì)。
收稿日期:2014-11-04