本文是一个参考的文章.这类的技术使用不少但是很少关注理论方面的东西,爱技术就看看

1.mex 文件

mex文件的产生于用c/c++编写的算法,但是通过在matlab软件用mex var_fdl.c或者mex var_fdl.cpp编译而产生出来var_fdl.mexw32或者vaf_fdl.mexw64,此mex文件在matlab编写的项目可以像.m或者.p文件一样使用

2.mex文件的应用的情景

2.1如果Matlab需要调用已有的C算法,不需要将其翻译成m文件,只需要将其编译成mex文件即可

2.2如果为了性能,必须使用C编写核心代码

3..c/.cpp如何被识别为可以编译为mex文件

单纯一个C/cpp文件就用mex XXX.c/XXX.cpp来编译肯定是无法通过的,此类.c/.cpp文件必须包含一个mexFunction的函数

4.数据转换问题

每种语言都有自己的数据定义方式,A语言传入的数据要能被B语言识别,中间必须有转换的数据结构识别的解决方案.matlab调用C生成的MEX属于异构程序之间的整合,总的来说需要解决两个问题:接口和数据转换(由mxArray实现)

/*=================================================================

* mexfunction.c

* This example demonstrates how to use mexFunction.  It returns

* the number of elements for each input argument, providing the

* function is called with the same number of output arguments

* as input arguments.

* This is a MEX-file for MATLAB.

* Copyright 1984-2006 The MathWorks, Inc.

* All rights reserved.

*=================================================================*/

/* $Revision: 1.5.6.2 $ */

#include "mex.h"

#include "matrix.h"

#pragma comment(lib,"libmx.lib")

#pragma comment(lib,"libmex.lib")

double avgalgo(double*,int);

double varalgo(double*,double,int);

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

double *c_inmx;

double *c_outmx;

double avgdata=0;

double sumdata=0;

double *c_outmx_1;

mxArray *m_outmx[3];

size_t numrowcols = mxGetM(prhs[0])*mxGetN(prhs[0]);

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);//create address for output

c_inmx  = mxGetPr(prhs[0]);//matlab的mxArray必须通过中间变量才能被C/C++识别

c_outmx = mxGetPr(plhs[0]);//matlab的mxArray必须通过中间变量才能被C/C++识别

//algo wrtie by c

avgdata = avgalgo(c_inmx,numrowcols);

*c_outmx = varalgo(c_inmx,avgdata,numrowcols);//通过指针来修改指向的内容

mexCallMATLAB(2,m_outmx,1,prhs,"fudelin");//m_outmx调用matlab函数,产生的出参也是mxArray

c_outmx_1 = mxGetPr(m_outmx[0]);//matlab的mxArray必须通过中间变量才能被C/C++识别

for(int lp=0;lp<3;lp++)

printf("value-1 is %f\n",c_outmx_1[lp]);

c_outmx_1 = mxGetPr(m_outmx[1]);//matlab的mxArray必须通过中间变量才能被C/C++识别

for(int lp=0;lp<3;lp++)

printf("value-2 is %f\n",c_outmx_1[lp]);

double avgalgo(double *inArray,size_t tot)

double sumdata=0;

double avgdata=0;

for (size_t itlp=0; itlp<tot; itlp++)

sumdata += inArray[itlp];

avgdata = sumdata/tot;

return avgdata;

double varalgo(double *inArray,double avgvalue,size_t tot)

double sumdata=0;

for (size_t itlp=0; itlp<tot; itlp++)

sumdata += (inArray[itlp]-avgvalue)*(inArray[itlp]-avgvalue);

return sumdata/(tot-1);

参考博文