Matlab與C 混合MEX程式設計

2021-06-22 17:16:50 字數 1384 閱讀 8856

一、mexfunction

與c中的main函式一樣,mex程式中的開始函式為mexfunction.預設變數引數是:

void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)

其中nlhs指的是在呼叫函式時返回值的個數;

plhs是每個返回值(在matlab中都是矩陣)的指標;

nrhs指的是呼叫函式時的引數個數;

prhs是每個引數的指標。

在函式內部呼叫時,常用函式用法如下:

mxisnumeric(prhs[0]); // 判斷變數是否是數字

mxisdouble(prhs[0]); 

// 判斷變數是否為雙精度

mxisempty(prhs[0]); 

// 判斷變數是否為空值

mxiscomplex(prhs[0]); // 判斷變數是否為複數

mexprintf("%d", y); 

// 命令列中列印資料 x 

= mxgetn(prhs[0]); 

// 獲取各輸入引數的長度y 

= mxgetm(prhs[1]); 

// 獲取輸入引數的列數

points = mxgetscalar(prhs[1]); // 將返回變數的實部,為雙精度形資料

plhs[0]= mxcreatedoublematrix(1, 1, mxreal); // 建立1×1雙精度返回變數 x 

= mxgetdata(prhs[0]); // 獲取變數的指標,功能相當於mxgetpr()y 

= mxgetpr(plhs[0]); 

// 獲取變數的指標,資料為實數

對mexfunction的引數是進行指標操作的,不能用單純的return返回值。mex程式傳送回來的整數資料要變為雙精度型資料,才能為其它函式所處理。

二、例子:對

maxpooling.cpp與stochasticpooling.cpp的編譯

if exist('maxpooling')~=3

mex maxpooling.cpp compflags="/openmp $compflags" cxxflags="\$cflags -fopenmp" ldflags="\$ldflags -fopenmp" -largearraydims 

end;

if exist('stochasticpooling')~=3

mex stochasticpooling.cpp compflags="/openmp $compflags" cxxflags="\$cflags -fopenmp" ldflags="\$ldflags -fopenmp" -largearraydims 

end;

**:

matlab 與c c 混合MEX的程式設計

matlab中矩陣預算特別方便,但如果有無法避免的迴圈甚至多層巢狀的話,會非常影響程式的效率,因此通常會將這種需要大量迴圈的模組用c 編寫然後在matlab中呼叫。matlab中的的c 程式設計稱為mex程式設計 matlab executive 其中需要些乙個c 檔案,然後在matlab中用mex...

Matlab中mex與C混合程式設計總結

使用mex和c可以加快演算法的執行速度,mex檔案包含乙個入口函式如下 void mexfunction int nlhs,mxarray plhs,int nrhs,const mxarray prhs 入口函式有四個引數 prhs為mxarray結構體型別的指標陣列,該陣列的元素按順序指向所有的...

matlab和C C 混合程式設計 Mex

最近的專案需要matlab和c的混合程式設計,經過一番努力終於完成了專案要解決的問題。現在就將mex的一些經驗總結一下,當然只是剛剛開始,以後隨著學習的深入繼續新增。首先講講寫mex的一些常規規定,然後我們會重點關注混合程式設計中最難解決資料的問題 結構到底如何轉換,並且後面會重點說一下自己的程式。...