Matlab与C/C++联合编程之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时,就没有上面的问题,...- -||。
实验结果
混合编程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 |
Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)的更多相关文章
- Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示
如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0.6.0 ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(一)
MEX文件是一种可在matlab环境中调用的C语言(或fortran)衍生程序,mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件. 中文名 mex文件 外文名 MATLAB ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(二)
如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比 ...
- Matlab以MEX方式调用C源代码【转载】
原文地址:http://blog.sina.com.cn/s/blog_468651400100coas.html 这是自己整理的一个对应的文档:<Matlab以MEX方式调用C源代码> ...
- Matlab以MEX方式调用C源代码
#include "mex.h" // 使用MEX文件必须包含的头文件 // 执行具体工作的C函数 double add(double x, double y) { return ...
- matlab中文论坛视频谷普教程MATLAB压缩包介绍
matlab中文论坛视频谷普教程MATLAB压缩包介绍 我也正在学习这个软件 ,看到这个教程就在这里分享了,希望大家喜欢!Matlab 初学者视频教学1. Matlab视频:Matlab中文论坛为新手 ...
- Matlab中调用第三方Java代码
搞了一天,才算搞定. 第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: disp(java.lang.System.get ...
- MATLAB/Excel-如何将Excel数据导入MATLAB中
在使用MATLAB对矩阵进行数据处理时,为了方便编辑与修改,常常需要先将数据录入到Excel中,然后再将其导入到MATLAB中参与矩阵运算.本文在MATLAB 2013a和Office 2013环境下 ...
随机推荐
- valueForKeyPath的妙用(转)
可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@" ...
- linux特殊字符
linux特殊字符: * 匹配文件名中的任何字符串,包括空字符串. ? 匹配文件名中的任何单个字符. [...] 匹配[ ]中所包含的任何字符. [!...] 匹配[ ]中非感叹号!之后的字符. 当s ...
- double精度问题,数据范围
浮点数在计算机中存储方式 http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html 1. double: 1bit(符号位) ...
- PHP5中PDO的简单使用
PHP5中PDO的简单使用 标签: php数据库mysql扩展extensionexception 2012-05-06 10:27 27753人阅读 评论(0) 收藏 举报 分类: PHP(6) ...
- 【bzoj1018】堵塞的交通
[bzoj1018]堵塞的交通 题意 一个\(2*n\)的格子,相邻格子之间有一条道路.初始时道路是不通的. \(C\)个操作,每个操作为三种中的一种:(1)某条道路连起来:(2)某条道路断开:(3) ...
- 百度地图API首页 -- 鼠标经过:类似翻页效果和 类似锚点链接效果
var timer; $("li").on("mouseover",function(){ clearTimeout(timer); timer=null; $ ...
- HTML5自学笔记[ 5 ]JSON的新方法
eval和JSON.parse的区别:eval:可以解析任何字符串为js:parse:只能解析JSON形式的字符串变为js(更安全). json格式的字符串中的属性名必须加双引号“”. stringi ...
- isDebugEnabled作用
早上写了日志级别,然后想起在使用的时候经常用isDebugEnabled,一鼓作气.彻底弄懂它: 现象 if (logger.isDebugEnabled()) { logger.debug(m ...
- 《JavaScript权威指南》读书笔记(一)
日期 2015-11-28 把之前的读书笔记在我弄丢它之前搬过来~~ 时间过去好久,回头一看理解都不一样了. 重点浏览了一下和Java的不同之处: js是一种宽松类型语言:js不区别整形数值与浮点型数 ...
- JAVA 正则 Pattern 和 Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...