一、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的一些常規規定,然後我們會重點關注混合程式設計中最難解決資料的問題 結構到底如何轉換,並且後面會重點說一下自己的程式。...