湯俊, 張磊,樓力律
(河海大學 機電工程學院,江蘇 常州 213022)
?


自編頭文件的C-MEX混合編程
湯俊, 張磊,樓力律
(河海大學 機電工程學院,江蘇 常州 213022)
摘要:當使用MATLAB進行大規模數據處理時,一個工程中包含了多個程序,而且各程序需交叉調用多個子程序,這將導致程序執行效率低下。基于VC與MATLAB的自編頭文件的C-MEX混合編程可以有效解決這一問題。該方法在C/C++中自編一個頭文件,聲明需要用到的所有算法實現函數,并在另外的程序中編寫這些函數的代碼,通過mexFunction接口函數實現VC與MATLAB混合編程。
關鍵詞:C/C++;MATLAB;C-MEX;自編頭文件;混合編程
0引言
MATLAB在科學研究與工業技術開發方面有著極為廣泛的應用,具有強大的矩陣運算、數據處理和圖形顯示功能,其輸出結果可視化,編程效率極高,極少的代碼即可實現復雜的運行。利用這一完整的數學平臺,用戶可以快速實現十分復雜的功能,極大地提高了工程分析計算的效率。但與其他高級程序相比,Matlab 使用一種腳本語言,它的執行是逐行解釋執行的,也就是邊解釋邊執行,執行效率非常低,這就是常常看到的在開發一些復雜的算法時,通常會發現程序執行很慢[1]。
C/C++語言是目前最為流行的高級程序設計語言之一[2]。它的功能豐富、表達力強、使用靈活方便、應用面廣、目標程序高、可植入性好,適合作為系統描述語言,既可以用來編寫系統軟件,也可以用來編寫應用軟件。在工程實踐中,用戶使用MATLAB進行大規模數據處理時,會碰到復雜的循環語句程序,以及多程序調用多算法函數的情況。MATLAB往往由于執行效率的問題而顯得力不從心,這時可以使用C/C++語言進行算法的設計,然后在MATLAB環境中調用,從而大大提高數據處理的效率[3]。在C/C++與MATLAB混合編程過程中,使用C-MEX文件是一種常用的方法。本文基于MATLAB7.0和VC6.0開發環境,自編聲明算法實現函數的頭文件,在接口函數mexFunction()程序中包含該頭文件,實現C-MEX的混合編程。
1MEX文件的環境配置
實現MEX文件的編寫與編譯首先需要對MEX編譯器進行配置,生成配置文件[1]。對MATLAB編譯應用程序mex的配置命令為:
>>mex -setup
然后按系統提示進行選擇,本文選擇Microsoft Visual C++ 6.0作為編輯器。
2MATLAB調用自編頭文件的MEX文件
所謂MEX是MATLAB Executable的縮寫,它是一種“可在Matlab 中調用C(或Fortran)語言的衍生程序”[4]。C語言MEX文件的源程序主要由兩個截然不同的部分組成,分別用于完成不同任務。第一部分稱為計算程序,它包含了所有實際需要完成計算功能的源代碼,用來完成實際的計算工作,即用戶以前所編寫的算法和程序;第二部分稱為入口子程序,它是計算子程序同MATLAB環境之間的接口,用來完成兩者之間的通信任務。它定義被MATLAB調用外部子程序的入口地址,MATLAB系統向子程序傳遞的子程序參數、子程序向MATLAB系統返回的結果參數,以及調用計算功能子程序等[1]。MEX源文件的兩個組成部分既可以存放在一個文件中,也可以分為兩個文件來存放。
當MEX源文件的計算程序和入口子程序分開存放時,即算法實現函數和接口函數mexFunction()分別在兩個程序中,這時可以自編一個頭文件,聲明該算法實現函數,然后在新的程序中定義算法實現函數。注意編寫的入口子程序必須包含自編的頭文件。主要實現步驟如下:
1) VC6.0的編譯環境設置。添加相應的頭文件的路徑:打開菜單【Tools:Options...】選擇”Directories”選項卡。在”Show Directories for”組合框中選取”Include files”,添加”D:PROGRAM FILESMATLABR2010AEXTERNINCLUDE”;添加相應的庫文件的路徑:在”Show Directories for”中選取”Library files”添加”D:PROGRAM FILESMATLABR2010AEXTERNLIBWIN32MICROSOFT”;注意根據用戶MATLAB安裝位置,修改相應目錄。
2) 創建工程,并在工程中添加入口子程序和計算程序兩個C文件。
3) 在工程中添加聲明計算程序中定義的算法實現函數的自編頭文件。
4) 為工程添加DEF文件。
5) VC6.0的工程設置。添加需鏈接的庫文件:打開菜單【Project:Setting】選取”Link”選項卡,在”Object/Library Modules”里添加libmx.lib、libmat.lib、libmex.lib和libeng.lib;動態庫調試程序路徑的設置:打開菜單【Project:Setting】選取”Debug”選項卡,在”Executable debug for session”中選擇matlab.exe作為調試程序。
6) 調試程序,生成可執行mex文件。
3實例說明
下面通過一個簡單的實例說明MATLAB如何調用含自編頭文件C/C++生成可執行mex文件。
有一個用C語言寫的函數,實現了一個功能,如一個簡單的函數:
double add(double x,double y)
{return x+y;}
通過C-MEX混合編程生成mex文件實現在MATLAB使用它,如輸入:
>>a=add(1.1,2.2)
a= 3.3000
mex文件實際上是一個特別的動態鏈接庫,輸出函數為mexFunction()。當使用C-MEX混合編程時,使用C/C++中的Win32 Dynamic Link Library、MFC APPWizard(DLL)靜態鏈接庫和擴展MFC動態鏈接庫創建MEX程序[3]。首先根據章節2的步驟1做好VC6.0編譯環境設置。這里新建一個MFC AppWizard(dll)工程,工程名為add,選擇使用靜態連接的MFC的DLL。在工程中添加入口子程序add.c、計算程序a.c、自編頭文件add.h。為了方便讀者閱讀,將主要程序代碼源代碼整理如下:
//add.c
/*add.c中存放入口子程序*/
#include"add.h"/*add.h頭文件中聲明
計算實現功能函數aad()*/
#include"mex.h"
void mexFunction(int nlhs,mxArray
*plhs[], int nrhs,const mxArray *prhs[])
/*實現接口功能*/
{
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);
/*調用計算實現功能函數aad()*/}
//add.h
/*add.h中聲明計算實現功能函數add()*/
double add(double x,double y);
//a.c
/*a.c中存放計算實現函數代碼*/
#include”add.h”
#include”mex.h”
double add(double x,double y)
{
return x+y;
}
根據章節2的步驟5做好工程設置后,打開該工程DEF文件,并對其內容進行編輯,即在Exports后面添加一行”;mexFunction()”。按F5運行程序調試,編譯連接通過后,MATLAB作為調試路徑自動啟動。在Command Window里輸入:
>>mex -v add.c a.c
成功生成add.mexw32,MATLAB便可以像調用m文件那樣直接調用該文件。在MATLAB的Command Window里輸入:
>> a=add(1.1,2.2)
a=3.3000
這與單獨使用C/C++編寫程序的運行結果一致。上述實例中只含有一個子程序a.c。如果入口子程序需調用多個算法函數,只需要在自編的頭文件add.h中聲明這些函數,在新的子程序中編寫算法函數代碼。需要注意的是在MATLAB的Command Window里輸入的mex命令需包含主程序(入口程序)以及所有的子程序。
4結語
簡單闡述了基于VC和MATLAB的自編頭文件的C-MEX混合編程方法,實現了兩種編程語言的無縫鏈接。對于多程序調用多個子程序的復雜情況,該方法可供工程人員進行參考,方便編程,提高數據處理效率。
參考文獻:
[1] 王素立, 高潔, 孫新德. MATLAB混合編程與工程應用[M]. 北京:清華大學出版社, 2008.05.
[2] 錢能. C++程序設計教程[M]. 北京:清華大學出版社, 2005.
[3] 張亮,王繼陽. MATLAB與C/C++混合編程[M]. 北京:人民郵電出版社,2008.11.
[4] 董長虹. Matlab接口技術與應用[M]. 北京:國防工業出版社, 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
中圖分類號:TP311
文獻標志碼:A
文章編號:1671-5276(2015)02-0101-02
作者簡介:湯俊(1986-),男,湖北黃岡人,碩士研究生,主要研究方向為等幾何分析與結構優化設計。
收稿日期:2014-11-04