最近写了个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时,就没有上面的问题,...- -||。
实验结果
混合编程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++代码