matlab和c++混合程式設計---Mex結構和mexFunction引數傳遞
最近的專案需要matlab和C的混合程式設計,經過一番努力終於完成了專案要解決的問題。現在就將Mex的一些經驗總結一下,當然只是剛剛開始,以後隨著學習的深入繼續新增。首先講講寫Mex的一些常規規定,然後我們會重點關注混合程式設計中最難解決資料的問題--結構到底如何轉換,並且後面會重點說一下自己的程式。
一、Mex的結構
先看一個簡單的程式(該程式儲存在matlab主目錄下名字是mexDemon.cpp,或者在主目錄下新建一個.cpp檔案):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include
"mex.h" //專案---右鍵屬性---c/c++---常規---附加包含目錄---新增“D:\programs installing\matlab2016\extern\include”,將mex.h包含進去。
//加入標頭檔案,該標頭檔案在VS2010中無法include,但是不影響其在matlab中的編譯,反而在matlab編譯還需要include它
#include
<vector>
using namespace std;
void mexFunction( int nlhs,
mxArray *plhs[], int nrhs, const mxArray
*prhs[])
//mexFunction就類似於main函式
{
//nlhs代表的是輸出引數的個數
//plhs是一個指標陣列,裡面的指標指向mxArray型別,每一個指標指向一個輸出
//nrhs代表的是輸入引數的個數
//prhs是一個指標陣列,裡面的指標指向mxArray型別,每一個指標指向一個輸入
vector<vector< double >
> array2d;
double *z;
plhs[0]
= mxCreateDoubleMatrix( 5, 6, mxREAL); //第一個輸出是一個5*6的矩陣
z
= mxGetPr(plhs[0]); //獲得矩陣的第一個元素的指標
array2d.resize(5);
int ii
= 0;
for ( int i
= 0; i < 5; i++){
for ( int j
= 0; j < 6; j++){
z[i*6
+ j] = ii; //指標訪問矩陣是列優先的,請自己迴圈程式和分析輸出結果
ii++;
}
|