天天看點

Matlab C/C++ 混合程式設計

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程式。

繼續閱讀