在Matlab中使用mex函数进行C/C++混合编程

      最近写了个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时,就没有上面的问题,...- -||。

      实验结果

在Matlab中使用mex函数进行C/C++混合编程_第1张图片

      混合编程API一览


你可能感兴趣的:(在Matlab中使用mex函数进行C/C++混合编程)