最近写了个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时,就没有上面的问题,...- -||。
实验结果
例子:
timetwo.c
#include "mex.h"
void timestwo(double y[],double x[])
{
y[0]=2.0*x[0];
}
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
double *x,*y;
int mrows,ncols;
if(nrhs!=1) mexErrMsgTxt("one input required!");
else if(nlhs>1) mexErrMsgTxt("too many output arguments");
mrows=mxGetM(prhs[0]);
ncols=mxGetN(prhs[0]);
if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!(mrows==1&&ncols==1))
mexPrintf("intput must be a noncomplex double");
plhs[0]=mxCreateDoubleMatrix(mrows,ncols,mxREAL);
x=mxGetPr(prhs[0]);
y=mxGetPr(plhs[0]);
timestwo(y,x);
}