日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mex的结构

發布時間:2025/4/16 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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"? //加入頭文件,該頭文件在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++; ????????} ????} }? /* ?*ans = ?????0???? 5??? 10??? 15??? 20??? 25 ?????1???? 6??? 11??? 16??? 21??? 26 ?????2???? 7??? 12??? 17??? 22??? 27 ?????3???? 8??? 13??? 18??? 23??? 28 ?????4???? 9??? 14??? 19??? 24??? 29 ?*/

然后對Matlab編譯應用程序mex的編譯器進行設置,在命令窗口輸入 Mex –setup。 然后跟著步驟走選擇合適的編譯器即可。

設置完編譯器之后在命令窗口輸入Mex mexDemon.cpp 進行編譯生成.mexw64文件,生成之后便可以直接調用了,例如本例子可以這樣調用,就是直接在命令窗口輸入 a = mexDemon(); 返回值如上。


?二、C和Matlab的數據結構的轉換

(1)數值的傳遞

matlab -> c++

?
1 x = mxGetScalar(prhs[0]);//該函數獲取matlab傳遞過來的數值;

?c++ -> matlab

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);//創建返回的矩陣,范圍plhs[0]為mxArray類型 y = mxGetPr(plhs[0]);//獲取返回plhs[0]的數據地址,其后可以修改y的值就可以返回了

一個實例(numDemon.cpp):

?
1 2 3 4 5 6 7 8 9 10 11 #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ ????int x = mxGetScalar(prhs[0]); //將第一個輸入參數轉為Scalar標量,也就是單數值 ????printf("%d\n", x); //打印 ????? ????double *y; ????plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); //讓第一個輸出參數指向一個1*1的矩陣 ????y = mxGetPr(plhs[0]); //獲得矩陣的第一個元素的指針 ????*y = 10; //將其賦值為10 }

?如下圖在命令窗口編譯:


?(2)矩陣的傳入與傳出

關于傳出(c++到Matlab, 就是第一個例子),下面可以再給一個例子是如何從matlab傳入到c++,看下面這段代碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ ????double *dataCursor; ????vector<vector<double> > parms; ????dataCursor = mxGetPr(prhs[0]); //得到輸入矩陣的第一個元素的指針 ????int mrows = mxGetM(prhs[0]);?? //獲得矩陣的行 ????int ncols = mxGetN(prhs[0]);?? //獲得矩陣的列 ????printf("%d_%d\n", mrows, ncols);? //打印行和列 ????? ????parms.resize(mrows);? //初始化 ????for(int i = 0; i < mrows; i++){ ????????parms[i].resize(ncols); ????} ????for(int i = 0; i < mrows; i++){ ????????for(int j = 0; j < ncols; j++){ ????????????parms[i][j] = dataCursor[j * mrows + i]; //拷貝矩陣的元素到vector of vector ????????} ????} }

?同樣在命令窗口編譯即可。

?


(3)字符串的傳入與傳出

matlab -> c++ (傳入)

?
1 2 char *input_buf; input_buf = mxArrayToString(prhs[0]);//使用mxArrayToString將mxArray轉換為c、c++字符串

?c++ -> matlab (傳出)

?
1 2 3 4 5 char *output_buf;//定義字符串緩存 size_t buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1;//獲取字符串長度,mxGetM獲取行數,mxGetN獲取列數 output_buf=mxCalloc(buflen, sizeof(char));//使用mxCalloc分配輸出字符串數組 plhs[0] = mxCreateString(output_buf);//使用mxCreateString創建mxArray輸出 mxfree(output_buf);

?一個實例(strDemon.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 #include "mex.h" void revord(char *input_buf, size_t buflen, char *output_buf) { ??mwSize i; ??if (buflen == 0) return; ?? ??for(i=0;i<buflen-1;i++) ????*(output_buf+i) = *(input_buf+buflen-i-2); } void mexFunction( int nlhs, mxArray *plhs[], ??????????????????int nrhs, const mxArray *prhs[]) { ????char *input_buf, *output_buf; ????size_t buflen; ???? ????buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; //因為本程序是翻轉字符串,所以輸入輸出字符串的長度應該一樣 ???? ????output_buf=mxCalloc(buflen, sizeof(char)); //申請空間 ???? ????input_buf = mxArrayToString(prhs[0]); //獲得輸入字符串 ???? ????revord(input_buf, buflen, output_buf); //翻轉字符串 ???? ????plhs[0] = mxCreateString(output_buf); ????mxFree(input_buf); ????return; }

同樣編譯一下即可。?

?


(4)cell的傳入

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ ????mwSize cellNdim = mxGetNumberOfDimensions(prhs[0]); //這里介紹兩個函數mxGetNumberOfDimensions和mxGetDimensions ????const int *cellColPtr = mxGetDimensions(prhs[0]); ????//mxGetDimensions: 就是返回一個指針ptr,每一個指針所指向的值是每一個維度的元素個數。例如有矩陣3*2的矩陣,那么*(ptr)為3,*(ptr+1)為2. ????//mxGetNumberOfDimensions: 返回mxArray的維度。  ?? int cellNRow = *(label_dims); ????int cellNCol = *(label_dims + 1); ????mxArray *ptr; ????ptr = mxGetCell(prhs[0], 0); //獲取cell的第0個元素,返回一個mxArray指針,第二個參數代表cell中元素的下標 ????mxArray *cellOfCell; ????cellOfCell = mxGetCell(ptr, 0);??? //當然cell里面可以還是cell,那么應該再樣寫 ????mxArray *cellOfStr; ????char *chTmp; ????cellOfStr = mxGetCell(prhs[0], 0); //當然cell里面可以是字符串 ????chTmp = mxArrayToString(cellOfStr); ????printf("%s\n", chTmp); }

總結

以上是生活随笔為你收集整理的Mex的结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。