999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2015-02-22 09:43:23湯俊張磊樓力律
機械制造與自動化 2015年2期

湯俊, 張磊,樓力律

(河海大學 機電工程學院,江蘇 常州 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

主站蜘蛛池模板: 日韩AV无码免费一二三区| 成人午夜免费观看| 91毛片网| 久久综合久久鬼| 免费毛片全部不收费的| 日韩免费成人| 亚洲电影天堂在线国语对白| 精品超清无码视频在线观看| 国产杨幂丝袜av在线播放| 91最新精品视频发布页| 国产视频 第一页| 熟妇人妻无乱码中文字幕真矢织江 | 亚洲欧美日韩久久精品| 国产精品30p| 老色鬼久久亚洲AV综合| 日本精品影院| 国产无人区一区二区三区| 日韩精品免费在线视频| 91小视频在线| 亚洲第一成年人网站| 国产精品永久不卡免费视频| 亚洲欧美日韩色图| 黄色三级网站免费| 国产另类视频| 欧美激情综合| 无码日韩视频| 中文字幕亚洲另类天堂| 久久精品丝袜| 五月婷婷中文字幕| 亚洲欧美国产视频| 亚亚洲乱码一二三四区| 国产一区免费在线观看| 丰满人妻中出白浆| …亚洲 欧洲 另类 春色| 天天激情综合| 亚洲成人播放| 大香网伊人久久综合网2020| 久久国语对白| 动漫精品啪啪一区二区三区| 天天色天天操综合网| 成人噜噜噜视频在线观看| 国产熟睡乱子伦视频网站| 曰韩人妻一区二区三区| 日韩人妻少妇一区二区| 日本午夜在线视频| 极品私人尤物在线精品首页| AV网站中文| 无码福利视频| 91精品小视频| 99精品久久精品| 国产三区二区| AV在线天堂进入| 日韩精品免费在线视频| 日韩视频精品在线| 国产毛片片精品天天看视频| 国产69囗曝护士吞精在线视频| 久久99这里精品8国产| 成人午夜精品一级毛片 | 欧美午夜网站| 在线毛片网站| 9cao视频精品| 国产精品女主播| 久久精品人人做人人爽电影蜜月| 亚洲,国产,日韩,综合一区| 国产亚洲高清视频| 91麻豆国产精品91久久久| 精品無碼一區在線觀看 | 国产91丝袜在线播放动漫| 欧美69视频在线| 亚洲日韩国产精品无码专区| 特级毛片免费视频| 日韩精品中文字幕一区三区| 重口调教一区二区视频| 亚洲va在线∨a天堂va欧美va| 国产女人在线| 国产幂在线无码精品| 国产成人精品18| 日韩乱码免费一区二区三区| 国产精品综合色区在线观看| 亚洲资源站av无码网址| 国产无遮挡猛进猛出免费软件| 国产成人精品一区二区三在线观看|