基於MEX文件的Matlab與C語言接口實例

轉自:


如果我有一個用C語言寫的函數,實現了一個功能,如一個簡單的函數:


double add(double x, double y)


{


return x + y;


}




現在我想要在Matlab中使用它,比如輸入:


>> a = add(1.1, 2.2)


3.3000


可以通過MEX作爲與C語言的接口來實現。MEX是一種動態連接子程序,可以用C語言編寫。在Windows系統下後綴名爲dll。


現在我們要寫一個包含add和mexFunction的C文件,Matlab調用函數,把函數中的自變量傳給 mexFunction的一個參數,mexFunction把該值傳給add,把得出的結果傳回給mexFunction的另一個參數,Matlab通過該參數來給出在Matlab語句中調用函數時的輸出值。


完整的C程序如下:


#include "mex.h" // 使用MEX文件必須包含的頭文件




// 執行具體工作的C函數


double add(double x, double y)


{


return x + y;


}




// MEX文件接口函數


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);


}


我們現在來說mexFunction怎樣寫。 


mexFunction的定義爲: 


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])


{


/*....................................*/





可以看到,mexFunction是沒返回值的,它不是通過返回值把結果傳回Matlab的,而是通過對參數plhs的賦值。mexFunction的四個參數皆是說明Matlab調用MEX文件時的具體信息,如這樣調用函數時: 


>> b = 1.1; c = 2.2;


>> a = add(b, c) 


mexFunction四個參數的意思爲: 


nlhs = 1,說明調用語句左手面(lhs-left hand side)有一個變量,即a。


nrhs = 2,說明調用語句右手面(rhs-right hand side)有兩個自變量,即b和c。



plhs是一個數組,其內容爲指針,該指針指向數據類型mxArray。因爲現在左手面只有一個變量,即該數組只有一個指針,plhs[0]指向的結果會賦值給a。


prhs和plhs類似,因爲右手面有兩個自變量,即該數組有兩個指針,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指針數組,即不能改變其指向內容。 


因爲Matlab最基本的單元爲array,無論是什麼類型也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是一個1x1的double array。而在C語言中,Matlab的array使用mxArray類型來表示。所以就不難明白爲什麼plhs和prhs都是指向mxArray類型的指針數組。


下面詳細介紹如何用c語言編寫mex文件:


2 編譯器的安裝與配置



要使用MATLAB編譯器,用戶計算機上應用事先安裝與MATLAB適配的以下任何一種ANSI C/C++編譯器:


5.0、6.0版的MicroSoft Visual C++(MSVC)


5.0、5.2、5.3、5.4、5.5版的Borland C++


LCC(由MATLAB自帶,只能用來產生MEX文件) 


下面是安裝與配置MATLAB編譯器應用程序MEX的設置的步驟: 


(1)在MATLAB命令窗口中運行mex –setup,出現下列提示:


Please choose your compiler for building external interface (MEX) files:


Would you like mex to locate installed compilers [y]/n?




(2)選擇y,MATLAB將自動搜索計算機上已安裝的外部編譯器的類型、版本及所在路徑,並列出來讓用戶選擇:


Select a compiler:


[1] Borland C++Builder version 6.0 in C:\Program Files\Borland


[2] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio


[3] Lcc C version 2.4 in D:\MATLAB6P5P1\sys\lcc


[4] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio


[0] None


Compiler:


(3)選擇其中一種(在這裏選擇了3),MATLAB讓用戶進行確認:


Please verify your choices:


Compiler: Lcc C 2.4


Location: D:\MATLAB6P5P1\sys\lcc


Are these correct?([y]/n):




(4)選擇y,結束MATLAB編譯器的配置。 
matlab下演示:


>> mex -setup
Please choose your compiler for building external interface (MEX) files: 
 
Would you like mex to locate installed compilers [y]/n? y
 
Select a compiler: 
[1] Lcc C version 2.4 in D:\MATLAB7\sys\lcc 
[2] Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio 
 
[0] None 
 
Compiler: 2
 
Please verify your choices: 
 
Compiler: Microsoft Visual C/C++ 6.0 
Location: D:\Program Files\Microsoft Visual Studio 
 
Are these correct?([y]/n): y
 
Try to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\mexopts.bat 
From template:              D:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.bat 
 
Done . . . 
 
>>


在Matlab command window下輸入剛纔編寫好的C程序名。


如:


>> mex add.cpp


注意輸入程序名的時候,需要在程序所在的當前路徑下,否則會出現


D:\MATLAB7\BIN\WIN32\MEX.PL: Error: 'add.c' not found. 
 
??? Error using ==> mex
Unable to complete successfully


mex add.cpp順利執行後會產生相應的add.dll文件,此時則可在Matlab下執行add程序。


輸入及運行結果:


>> b=1;c=2;
>> a=add(b,c)


a =


     3





>> a=add(3,4)


a =


     7


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章