matlab编程c 使用方法,Matlab和C混合编程:从应用到技术

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

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

参考博文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值