Matlab與C/C++混合編程接口及應(yīng)用
摘要:Matlab具有很強(qiáng)的數(shù)值計(jì)算和分析等能力,而C/C++是目前最為流行的高級(jí)程序設(shè)計(jì)語(yǔ)言,兩者互補(bǔ)結(jié)合的混合編程在科學(xué)研究和工程實(shí)踐中具有非常重要的意義。從Matlab調(diào)用C/C++代碼及C/C++調(diào)用m文件兩方面,深入地研究了它們之間混合編程的原理和實(shí)現(xiàn)機(jī)制,并且給出了具體條件下的混合編程方法和步驟。實(shí)驗(yàn)表明,給出的Matlab與C/C++混合編程接口及應(yīng)用方法是有效、實(shí)用的。
本文引用地址:http://www.ex-cimer.com/article/189994.htm1 引言
Matlab 是當(dāng)前應(yīng)用最為廣泛的數(shù)學(xué)軟件,具有強(qiáng)大的數(shù)值計(jì)算、數(shù)據(jù)分析處理、系統(tǒng) 分析、圖形顯示甚至符號(hào)運(yùn)算等功能[1]。利用這一完整的數(shù)學(xué)平臺(tái),用戶可以快速實(shí)現(xiàn)十分 復(fù)雜的功能,極大地提高工程分析計(jì)算的效率[2][3]。但與其他高級(jí)程序[3]相比,Matlab 程序 是一種解釋執(zhí)行程序,不用編譯等預(yù)處理,程序運(yùn)行速度較慢[4]。
C/C++語(yǔ)言是目前最為流行的高級(jí)程序設(shè)計(jì)語(yǔ)言之一[5]。它可對(duì)操作系統(tǒng)和應(yīng)用程序以 及硬件進(jìn)行直接操作,用C/C++語(yǔ)言明顯優(yōu)于其它解釋型高級(jí)語(yǔ)言,一些大型應(yīng)用軟件如 Matlab 就是用C 語(yǔ)言開(kāi)發(fā)的。
在工程實(shí)踐中,用戶經(jīng)常遇到Matlab 與C/C++混合編程的問(wèn)題。本文基于Matlab 6.5和VC6.0 開(kāi)發(fā)環(huán)境,在Windows 平臺(tái)下就它們之間的混合編程問(wèn)題進(jìn)行深入研究并舉例說(shuō)明。
2 Matlab 調(diào)用C/C++
Matlab 調(diào)用C/C++的方式主要有兩種:利用MEX 技術(shù)和調(diào)用C/C++動(dòng)態(tài)連接庫(kù)。
在Matlab 與C/C++混合編程之前,必須先對(duì)Matlab 的編譯應(yīng)用程序mex 和編譯器mbuild進(jìn)行正確的設(shè)置[1]:
對(duì)Matlab 編譯應(yīng)用程序mex 的設(shè)置:Mex –setup.
對(duì)Matlab 編譯器mbuild 的設(shè)置:Mbuild –setup.
2.1 調(diào)用C/C++的MEX 文件
MEX 是Matlab Executable 的縮寫(xiě),它是一種“可在Matlab 中調(diào)用的C(或Fortran)語(yǔ) 言衍生程序”[6]。MEX 文件的使用極為方便,其調(diào)用方式與Matlab 的內(nèi)建函數(shù)完全相同,只 需在Matlab 命令提示符下鍵入MEX 文件名即可。
一個(gè)C/C++的MEX源程序通常包括4個(gè)組成部分,其中前3個(gè)是必須包含的內(nèi)容,第4個(gè)則根據(jù)所實(shí)現(xiàn)的功能靈活選用:(1)#include “mex.h”;(2)MEX文件的入口函數(shù)mexFunction, MEX文件導(dǎo)出名必須為mexFunction函數(shù);(3)mxArray;(4)API函數(shù)
通過(guò)簡(jiǎn)單的例子說(shuō)明C/C++的MEX 源程序編寫(xiě)和調(diào)用過(guò)程:
#include mex.h
void timeSTwo(double y[], double x[])
{ y[0] = 2.0*x[0]; }
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )
{ double *x,*y; int mrows,ncols;
if(nrhs!=1) mexErrMsgTxt(One input required.);
else if(nlhs>1) mexErrMsgTxt(Too many output arguments);
mrows = mxGetM(prhs[0]);ncols = mxGetN(prhs[0]);
if( !mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!(mrows==1 ncols==1))
mexErrMsgTxt(Input must be a noncomplex scalar double.);
plhs[0]=mxCreateDoubleMatrix(mrows,ncols, mxREAL);
x=mxGetPr(prhs[0]); y=mxGetPr(plhs[0]); timestwo(y,x); }
用指令mex timestwo.c 編譯此文件,然后在MATLAB 命令行下調(diào)用生成的MEX 文件即可。
評(píng)論