国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

自編頭文件的C-MEX混合編程

2015-02-22 09:43:23湯俊張磊樓力律
機(jī)械制造與自動(dòng)化 2015年2期

湯俊, 張磊,樓力律

(河海大學(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

通州市| 海伦市| 陆河县| 东台市| 徐闻县| 海晏县| 眉山市| 鲁山县| 安达市| 五家渠市| 中山市| 虹口区| 谢通门县| 鲁山县| 六枝特区| 长治县| 旬邑县| 昌黎县| 运城市| 淮阳县| 威海市| 桂阳县| 新营市| 融水| 周至县| 会泽县| 建湖县| 徐水县| 大渡口区| 卢氏县| 东辽县| 额济纳旗| 洛川县| 南康市| 富川| 广州市| 清原| 泰州市| 旌德县| 苍山县| 闽清县|