最近寫了個Matlab程序,好慢吶……因此開始學習Matlab與C/C++混合編程。下面寫了個測試代碼,顯示一個Double類型矩陣中的元素。編程
源代碼數組
#include "mex.h" void displaySubscript( const mxArray *pArray, mwSize index ); /* 入口函數 */ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { /* 源文件名後綴爲.c時,全部變量聲明必須一次性完成,且放在最前面, 不然mex編譯錯誤 源文件名後綴爲.cpp時,沒有上面的問題,...- -|| */ double *pData; mwSize i; // 輸入參數必須爲一個,且爲double類型 if ( nrhs != 1 || mxDOUBLE_CLASS != mxGetClassID(prhs[0]) ) { mexErrMsgTxt( "輸入參數不合法……" ); } // 獲取數據指針 pData = mxGetPr(prhs[0]); // 遍歷全部元素並打印到屏幕 for ( i = 0; i != mxGetNumberOfElements(prhs[0]); i++ ) { displaySubscript( prhs[0], i ); mexPrintf( " = %g\n", pData[i] ); } } void displaySubscript( const mxArray *pArray, mwSize index ) { // 源文件名後綴爲.c時,全部變量聲明必須一次性完成,且放在最前面, 不然mex編譯錯誤 // 源文件名後綴爲.cpp時,沒有上面的問題,...- -||,代碼好齪... mwSize i, j; mwSize numOfDim; mwSize *subScript; mwSize subIndex; mwSize total; const mwSize *Dims; const char *className; // 獲取維度個數 numOfDim = mxGetNumberOfDimensions(pArray); // 獲取維度數組 Dims = mxGetDimensions(pArray); // 獲取類型名稱 className = mxGetClassName(pArray); // 分配下標數組內存 subScript = (mwSize *)mxCalloc( numOfDim, sizeof( mwSize ) ); // 根據當前的索引號生成下標 subIndex = index; for ( i = numOfDim - 1; ; i-- ) { total = 1; for ( j = 0; j < i; j++ ) { total *= Dims[j]; } subScript[i] = subIndex / total; subIndex = subIndex % total; if ( 0 == i ) { break; } } // 打印出全部下標 mexPrintf( "(" ); for ( i = 0; i < numOfDim - 1; i++ ) { mexPrintf( "%d,", subScript[i] + 1 ); } mexPrintf( "%d)", subScript[numOfDim-1] + 1 ); // 釋放下標數組內存 mxFree( subScript ); }
在Matlab使用mex命令編譯源文件時,要注意這樣一個現象:源文件名後綴爲.c時,全部變量聲明必須一次性完成,且放在最前面, 不然mex編譯錯誤;而源文件名後綴爲.cpp時,就沒有上面的問題,...- -||。函數
實驗結果學習
例子:測試
timetwo.cui
#include "mex.h" void timestwo(double y[],double x[]) { y[0]=2.0*x[0]; } void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { double *x,*y; int mrows,ncols; if(nrhs!=1) mexErrMsgTxt("one input required!"); else if(nlhs>1) mexErrMsgTxt("too many output arguments"); mrows=mxGetM(prhs[0]); ncols=mxGetN(prhs[0]); if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!(mrows==1&&ncols==1)) mexPrintf("intput must be a noncomplex double"); plhs[0]=mxCreateDoubleMatrix(mrows,ncols,mxREAL); x=mxGetPr(prhs[0]); y=mxGetPr(plhs[0]); timestwo(y,x); }