本文是一个参考的文章.这类的技术使用不少但是很少关注理论方面的东西,爱技术就看看
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
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
sumdata += (inArray[itlp]-avgvalue)*(inArray[itlp]-avgvalue);
return sumdata/(tot-1);
参考博文