博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++编写Matlab函数
阅读量:7208 次
发布时间:2019-06-29

本文共 2558 字,大约阅读时间需要 8 分钟。

hot3.png

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

转载于:https://my.oschina.net/u/2245781/blog/550178

你可能感兴趣的文章
代码生成工具更新--快速生成Winform框架的界面项目
查看>>
Jquery根据JSON生成Table
查看>>
[Oracle]Sqlplus 中使用 new_value
查看>>
【HTTP】 认证和单点登录 【瞎写的…】
查看>>
微信小程序-上传多张图片加进度条(支持预览、删除)
查看>>
Java基础-SSM之mybatis快速入门篇
查看>>
error C2220: 警告被视为错误 - 没有生成“object”文件
查看>>
IO is frozen on database xxx, No user action is required
查看>>
执行perl xttdriver.pl报错Can't locate Getopt/Long.pm in @INC
查看>>
log4j的最佳实践(转)
查看>>
linux中 jdk 的卸载和安装[转]
查看>>
Install And Configure ColdFusion MX 6.1 on Windows
查看>>
[转]Error: "SQL BPA command line has encountered a problem and needs to close"
查看>>
objective-C 的内存管理之-引用计数
查看>>
如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
查看>>
通过TextWatcher去观察输入框中输入的内容以及输入字符个数
查看>>
C#窗体控件-单选按钮控件RadioButton
查看>>
[C++]红色波浪线是什么意思
查看>>
tomcat之 JDK8.0安装、tomcat-8.5.15安装
查看>>
Android ADB命令
查看>>