最近寫了個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 http://www.linuxidc.com/Linux/2014-09/106242.htm
Matlab與C/C++聯合編程之從Matlab調用C/C++代碼 http://www.linuxidc.com/Linux/2012-08/68148.htm
二分類SVM方法Matlab實現 http://www.linuxidc.com/Linux/2013-05/84050.htm
Matlab中的取整函數fix, floor, ceil與round http://www.linuxidc.com/Linux/2013-10/91161.htm
Matlab編譯cuda的.cu文件 http://www.linuxidc.com/Linux/2014-04/100675.htm
Linux Matlab服務器進一步改造成Application Server(應用程序服務器) http://www.linuxidc.com/Linux/2014-09/106340.htm