在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++混合编程

混合编程API一览

MX Matrix Library

mwIndex (C and Fortran)

 

Type for index values

 

mwPointer (Fortran)

 

Pointer type for platform

 

mwSignedIndex (C and Fortran)

 

Signed integer type for size values

 

mwSize (C and Fortran)

 

Type for size values

 

mxAddField (C and Fortran)

 

Field to structure array

 

mxArray (C and Fortran)

 

Type for MATLAB array

 

mxArrayToString (C)

 

Convert array to string

 

mxAssert (C)

 

Check assertion value for debugging purposes

 

mxAssertS (C)

 

Check assertion value without printing assertion text

 

mxCalcSingleSubscript (C and Fortran)

 

Offset from first element to desired element

 

mxCalloc (C and Fortran)

 

Allocate dynamic memory for array using MATLAB memory manager

 

mxChar (C)

 

Type for string array

 

mxClassID (C)

 

Enumerated value identifying class of array

 

mxClassIDFromClassName (Fortran)

 

Identifier corresponding to class

 

mxComplexity (C)

 

Flag specifying whether array has imaginary components

 

mxCopyCharacterToPtr (Fortran)

 

CHARACTER values from Fortran array to pointer array

 

mxCopyComplex16ToPtr (Fortran)

 

COMPLEX*16 values from Fortran array to pointer array

 

mxCopyComplex8ToPtr (Fortran)

 

COMPLEX*8 values from Fortran array to pointer array

 

mxCopyInteger1ToPtr (Fortran)

 

INTEGER*1 values from Fortran array to pointer array

 

mxCopyInteger2ToPtr (Fortran)

 

INTEGER*2 values from Fortran array to pointer array

 

mxCopyInteger4ToPtr (Fortran)

 

INTEGER*4 values from Fortran array to pointer array

 

mxCopyPtrToCharacter (Fortran)

 

CHARACTER values from pointer array to Fortran array

 

mxCopyPtrToComplex16 (Fortran)

 

COMPLEX*16 values from pointer array to Fortran array

 

mxCopyPtrToComplex8 (Fortran)

 

COMPLEX*8 values from pointer array to Fortran array

 

mxCopyPtrToInteger1 (Fortran)

 

INTEGER*1 values from pointer array to Fortran array

 

mxCopyPtrToInteger2 (Fortran)

 

INTEGER*2 values from pointer array to Fortran array

 

mxCopyPtrToInteger4 (Fortran)

 

INTEGER*4 values from pointer array to Fortran array

 

mxCopyPtrToPtrArray (Fortran)

 

Pointer values from pointer array to Fortran array

 

mxCopyPtrToReal4 (Fortran)

 

REAL*4 values from pointer array to Fortran array

 

mxCopyPtrToReal8 (Fortran)

 

REAL*8 values from pointer array to Fortran array

 

mxCopyReal4ToPtr (Fortran)

 

REAL*4 values from Fortran array to pointer array

 

mxCopyReal8ToPtr (Fortran)

 

REAL*8 values from Fortran array to pointer array

 

mxCreateCellArray (C and Fortran)

 

Unpopulated N-D cell array

 

mxCreateCellMatrix (C and Fortran)

 

Unpopulated 2-D cell array

 

mxCreateCharArray (C and Fortran)

 

Unpopulated N-D string array

 

mxCreateCharMatrixFromStrings (C and Fortran)

 

Create populated 2-D string array

 

mxCreateDoubleMatrix (C and Fortran)

 

2-D, double-precision, floating-point array initialized to 0

 

mxCreateDoubleScalar (C and Fortran)

 

Scalar, double-precision array initialized to specified value

 

mxCreateLogicalArray (C)

 

N-D logical array initialized to false

 

mxCreateLogicalMatrix (C)

 

2-D, logical array initialized to false

 

mxCreateLogicalScalar (C)

 

Scalar, logical array

 

mxCreateNumericArray (C and Fortran)

 

Unpopulated N-D numeric array

 

mxCreateNumericMatrix (C and Fortran)

 

Numeric matrix initialized to 0

 

mxCreateSparse (C and Fortran)

 

2-D unpopulated sparse array

 

mxCreateSparseLogicalMatrix (C)

 

Unpopulated 2-D, sparse, logical array

 

mxCreateString (C and Fortran)

 

Create 1-by-N array initialized to specified string

 

mxCreateStructArray (C and Fortran)

 

Unpopulated N-D structure array

 

mxCreateStructMatrix (C and Fortran)

 

Unpopulated 2-D structure array

 

mxDestroyArray (C and Fortran)

 

Free dynamic memory allocated by MXCREATE* functions

 

mxDuplicateArray (C and Fortran)

 

Make deep copy of array

 

mxFree (C and Fortran)

 

Free dynamic memory allocated by MXCALLOC, MXMALLOC, or MXREALLOC functions

 

mxGetCell (C and Fortran)

 

Contents of array cell

 

mxGetChars (C)

 

Pointer to character array data

 

mxGetClassID (C and Fortran)

 

Class of array

 

mxGetClassName (C and Fortran)

 

Class of array as string

 

mxGetData (C and Fortran)

 

Pointer to real data

 

mxGetDimensions (C and Fortran)

 

Pointer to dimensions array

 

mxGetElementSize (C and Fortran)

 

Number of bytes required to store each data element

 

mxGetEps (C and Fortran)

 

Value of EPS

 

mxGetField (C and Fortran)

 

Field value, given field name and index, into structure array

 

mxGetFieldByNumber (C and Fortran)

 

Field value, given field number and index, into structure array

 

mxGetFieldNameByNumber (C and Fortran)

 

Field name, given field number, in structure array

 

mxGetFieldNumber (C and Fortran)

 

Field number, given field name, in structure array

 

mxGetImagData (C and Fortran)

 

Pointer to imaginary data of array

 

mxGetInf (C and Fortran)

 

Value of infinity

 

mxGetIr (C and Fortran)

 

Sparse matrix IR array

 

mxGetJc (C and Fortran)

 

Sparse matrix JC array

 

mxGetLogicals (C)

 

Pointer to logical array data

 

mxGetM (C and Fortran)

 

Number of rows in array

 

mxGetN (C and Fortran)

 

Number of columns in array

 

mxGetNaN (C and Fortran)

 

Value of NaN (Not-a-Number)

 

mxGetNumberOfDimensions (C and Fortran)

 

Number of dimensions in array

 

mxGetNumberOfElements (C and Fortran)

 

Number of elements in array

 

mxGetNumberOfFields (C and Fortran)

 

Number of fields in structure array

 

mxGetNzmax (C and Fortran)

 

Number of elements in IR, PR, and PI arrays

 

mxGetPi (C and Fortran)

 

Imaginary data elements in array of type DOUBLE

 

mxGetPr (C and Fortran)

 

Real data elements in array of type DOUBLE

 

mxGetProperty (C and Fortran)

 

Value of public property of MATLAB object

 

mxGetScalar (C and Fortran)

 

Real component of first data element in array

 

mxGetString (C and Fortran)

 

String array to C-style string

 

mxIsCell (C and Fortran)

 

Determine whether input is cell array

 

mxIsChar (C and Fortran)

 

Determine whether input is string array

 

mxIsClass (C and Fortran)

 

Determine whether array is member of specified class

 

mxIsComplex (C and Fortran)

 

Determine whether data is complex

 

mxIsDouble (C and Fortran)

 

Determine whether mxArray represents data as double-precision, floating-point numbers

 

mxIsEmpty (C and Fortran)

 

Determine whether array is empty

 

mxIsFinite (C and Fortran)

 

Determine whether input is finite

 

mxIsFromGlobalWS (C and Fortran)

 

Determine whether array was copied from MATLAB global workspace

 

mxIsInf (C and Fortran)

 

Determine whether input is infinite

 

mxIsInt16 (C and Fortran)

 

Determine whether array represents data as signed 16-bit integers

 

mxIsInt32 (C and Fortran)

 

Determine whether array represents data as signed 32-bit integers

 

mxIsInt64 (C and Fortran)

 

Determine whether array represents data as signed 64-bit integers

 

mxIsInt8 (C and Fortran)

 

Determine whether array represents data as signed 8-bit integers

 

mxIsLogical (C and Fortran)

 

Determine whether array is of type mxLogical

 

mxIsLogicalScalar (C)

 

Determine whether scalar array is of type mxLogical

 

mxIsLogicalScalarTrue (C)

 

Determine whether scalar array of type mxLogical is true

 

mxIsNaN (C and Fortran)

 

Determine whether input is NaN (Not-a-Number)

 

mxIsNumeric (C and Fortran)

 

Determine whether array is numeric

 

mxIsSingle (C and Fortran)

 

Determine whether array represents data as single-precision, floating-point numbers

 

mxIsSparse (C and Fortran)

 

Determine whether input is sparse array

 

mxIsStruct (C and Fortran)

 

Determine whether input is structure array

 

mxIsUint16 (C and Fortran)

 

Determine whether array represents data as unsigned 16-bit integers

 

mxIsUint32 (C and Fortran)

 

Determine whether array represents data as unsigned 32-bit integers

 

mxIsUint64 (C and Fortran)

 

Determine whether array represents data as unsigned 64-bit integers

 

mxIsUint8 (C and Fortran)

 

Determine whether array represents data as unsigned 8-bit integers

 

mxLogical (C)

 

Type for logical array

 

mxMalloc (C and Fortran)

 

Allocate dynamic memory using MATLAB memory manager

 

mxRealloc (C and Fortran)

 

Reallocate dynamic memory using MATLAB memory manager

 

mxRemoveField (C and Fortran)

 

Remove field from structure array

 

mxSetCell (C and Fortran)

 

Value of one cell of array

 

mxSetClassName (C)

 

Convert structure array to MATLAB object array

 

mxSetData (C and Fortran)

 

Set pointer to data

 

mxSetDimensions (C and Fortran)

 

Modify number of dimensions and size of each dimension

 

mxSetField (C and Fortran)

 

Set structure array field, given structure field name and array index

 

mxSetFieldByNumber (C and Fortran)

 

Set structure array field, given field number and index

 

mxSetImagData (C and Fortran)

 

Imaginary data pointer for array

 

mxSetIr (C and Fortran)

 

IR array of sparse array

 

mxSetJc (C and Fortran)

 

JC array of sparse array

 

mxSetM (C and Fortran)

 

Number of rows in array

 

mxSetN (C and Fortran)

 

Set number of columns in array

 

mxSetNzmax (C and Fortran)

 

Set storage space for nonzero elements

 

mxSetPi (C and Fortran)

 

Set new imaginary data for array

 

mxSetPr (C and Fortran)

 

Set new real data for array

 

mxSetProperty (C and Fortran)

 

Set value of public property of MATLAB object

 

MEX Library

mexAtExit (C and Fortran)

 

Register function to call when MEX-function cleared or MATLAB software terminates

 

mexCallMATLAB (C and Fortran)

 

Call MATLAB function, user-defined function, or MEX-file

 

mexCallMATLABWithTrap (C and Fortran)

 

Call MATLAB function, user-defined function, or MEX-file and capture error information

 

mexErrMsgIdAndTxt (C and Fortran)

 

Display error message with identifier and return to MATLAB prompt

 

mexErrMsgTxt (C and Fortran)

 

Display error message and return to MATLAB prompt

 

mexEvalString (C and Fortran)

 

Execute MATLAB command in caller workspace

 

mexEvalStringWithTrap (C and Fortran)

 

Execute MATLAB command in caller workspace and capture error information

 

mexFunction (C and Fortran)

 

Entry point to C/C++ or Fortran MEX-file

 

mexFunctionName (C and Fortran)

 

Name of current MEX-function

 

mexGet (C)

 

Value of specified Handle Graphics property

 

mexGetVariable (C and Fortran)

 

Copy of variable from specified workspace

 

mexGetVariablePtr (C and Fortran)

 

Read-only pointer to variable from another workspace

 

mexIsGlobal (C and Fortran)

 

Determine whether variable has global scope

 

mexIsLocked (C and Fortran)

 

Determine whether MEX-file is locked

 

mexLock (C and Fortran)

 

Prevent clearing MEX-file from memory

 

mexMakeArrayPersistent (C and Fortran)

 

Make array persist after MEX-file completes

 

mexMakeMemoryPersistent (C and Fortran)

 

Make memory allocated by MATLAB software persist after MEX-function completes

 

mexPrintf (C and Fortran)

 

ANSI C PRINTF-style output routine

 

mexPutVariable (C and Fortran)

 

Array from MEX-function into specified workspace

 

mexSet (C)

 

Set value of specified Handle Graphics property

 

mexSetTrapFlag (C and Fortran)

 

Control response of MEXCALLMATLAB to errors

 

mexUnlock (C and Fortran)

 

Allow clearing MEX-file from memory

 

mexWarnMsgIdAndTxt (C and Fortran)

 

Warning message with identifier

 

mexWarnMsgTxt (C and Fortran)

 

Warning message

 

Ubuntu Server上安装Matlab

Matlab与C/C++联合编程之从Matlab调用C/C++代码

二分类SVM方法Matlab实现

Matlab中的取整函数fix, floor, ceil与round

Matlab编译cuda的.cu文件

Linux Matlab服务器进一步改造成Application Server(应用程序服务器)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ae430309c0016623f64e1293adeb45a8.html