Matlab C/C++ 混合程式設計
- Matlab調用C++程式,所用mexFunction定義函數:
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { } // 參數說明如下: // 1)nlhs(number of left hand size parameters):傳回給Matlab的傳回值變量個數; // 2)plhs(pointer of left hand size parameters):函數傳回參數的指針; // 3)nrhs(number of right hand size parameters):函數傳入參數個數; // 4)prhs(pointer of right hand size parameters):函數傳入參數的指針;const表示不能改變其指向的内容,此時涉及到強制類型轉換,由double轉換為int。 // 常用函數總結 // mxGetScalar(prhs[0]):把prhs[0]傳遞進來的mxArray類型的指針指向的資料(标量)指派給C程式的變量。 // mxGetPr(prhs[0]):擷取指向prhs[0]傳進來的mxArray類型的double類型指針。 // 對于矩陣資料,需要使用mxGetM()和mxGetN()函數擷取相關資訊; // data=mxGetPr(prhs[0]); //獲得指向矩陣的指針 // M=mxGetM(prhs[0]); //獲得矩陣的行數 // N=mxGetN(prhs[0]); //獲得矩陣的列數 // 注意:Matlab中的矩陣元素b(i,j)在傳遞到C中的一維數組data後對應的為data[j*M+i] // mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag):用來申請m行n列的double類型矩陣空間,用于函數傳回值。 // mexErrMsgTxt(“Error”):給出錯誤提示并退出目前程式。 // mxIsDouble():判斷mxArray中的資料類型是否是double類型
Matlab提供的API中,帶mx-字首多數是對mxArray資料進行操作的函數;而帶mex-字首則是與Matlab環境進行互動的函數。
Matlab中基本單元為array,包括double array,cell array,struct array…,而在C語言中,Matlab的array對應使用mxArray,而在C++語言中,對應的為mwArray。
mex函數是一種接口,它将C語言中的計算結果适當的傳回給Matlab。當Matlab需要調用C語言程式設計的大型程式時,利用mex函數接口進行調用即可。Matlab與C/C++混合程式設計時,最好充分考慮到異常、錯誤等的處理。
Matlab調用C程式方法有兩種:
1)mex檔案實作:編寫相關的mex函數,然後用mex編譯即可。
2)Matlab調用C的dll。其調用dll的步驟:打開動态連結庫檔案;調用函數準備資料;調用動态連結庫檔案中導出的函數;關閉動态連結庫檔案
-
C/C++調用Matlab方法
調用Matlab計算引擎:混合程式設計後的可執行程式脫離不了Matlab的運作環境,運作速度很慢;
利用mcc編譯器生成的cpp和hpp檔案:雖然能獨立與Matlab運作環境,可在C/C++環境中包含生成檔案非常繁瑣
利用mcc編譯器生成個dll檔案:可以簡潔友善使C++/C調用Matlab程式。