c matlab婚变,C/C++编写Matlab函数

最近写了个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 

total *= Dims[j];

}

subScript[i] = subIndex / total;

subIndex = subIndex % total;

if ( 0 == i ) {

break;

}

}

// 打印出所有下标

mexPrintf( "(" );

for ( i = 0; i 

mexPrintf( "%d,", subScript[i] + 1 );

}

mexPrintf( "%d)", subScript[numOfDim-1] + 1 );

// 释放下标数组内存

mxFree( subScript );

}

在Matlab使用mex命令编译源文件时,要注意这样一个现象:源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误;而源文件名后缀为.cpp时,就没有上面的问题,...- -||。

实验结果

c144d3de92d73968e79687e4c2a5d93b.gif

例子:

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);

}

ef36715365079f2495e3ff0f42b58351.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值