C/C++編寫Matlab函數

      最近寫了個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);
}

相關文章
相關標籤/搜索