Matlab与C/C++混合编程接口应用总结

本文详细探讨了Matlab与C/C++的混合编程技术,包括Matlab调用C/C++的MEX文件和动态连接库,以及C/C++调用Matlab的计算引擎和通过mcc编译器生成的cpp、hpp文件和DLL。MEX文件提供了便捷的接口,而动态连接库调用适合不支持C++库和函数重载的情况。C/C++调用Matlab则有计算引擎、转换后的C/C++文件和DLL文件三种方式,各有优缺点。
摘要由CSDN通过智能技术生成

在参考文献基础上。补充和完善了。

MatlabC/C++混合编程接口及应用

 

  摘要:Matlab具有很强的数值计算和分析等能力,C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。从Matlab调用C/C++代码及C/C++调用m文件两方面,深入地研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤。实验表明,给出的MatlabC/C++混合编程接口及应用方法是有效、实用的。

  1引言

  Matlab是当前应用最为广泛的数学软件,具有强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算等功能[1]。利用这一完整的数学平台,用户可以快速实现十分复杂的功能,极大地提高工程分析计算的效率[2][3]。但与其他高级程序[3]相比,Matlab程序是一种解释执行程序,不用编译等预处理,程序运行速度较慢[4]

  C/C++语言是目前最为流行的高级程序设计语言之一[5]。它可对操作系统和应用程序以及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,一些大型应用软件如 Matlab 就是用C语言开发的。

  在工程实践中,用户经常遇到MatlabC/C++混合编程的问题。本文基于Matlab 6.5VC6.0开发环境,在Windows平台下就它们之间的混合编程问题进行深入研究并举例说明。

  2  Matlab调用C/C++

  Matlab调用C/C++的方式主要有两种:利用MEX技术调用C/C++动态连接库

  在MatlabC/C++混合编程之前,必须先对Matlab的编译应用程序mex和编译器mbuild进行正确的设置[1]

  对Matlab编译应用程序mex的设置:Mex –setup.

  对Matlab编译器mbuild的设置:Mbuild –setup.

  2.1调用C/C++MEX文件

  MEXMatlab Executable的缩写,它是一种可在Matlab中调用的C(Fortran)言衍生程序”[6]MEX文件的使用极为方便,其调用方式与Matlab的内建函数完全相同,只需在Matlab命令提示符下键入MEX文件名即可。

  一个C/C++MEX源程序通常包括4个组成部分,其中前3个是必须包含的内容,第4个则根据所实现的功能灵活选用:(1)#include “mex.h”;(2)MEX文件的入口函数mexFunction, MEX文件导出名必须为mexFunction函数;(3)mxArray;(4)API函数

  通过简单的例子说明C/C++MEX源程序编写和调用过程:

  #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 manyoutput arguments");

            mrows = mxGetM( prhs[0] );  ncols = mxGetN(prhs[0]);

  if( !mxIsDouble(prhs[0]) || mxIsComplex( prhs[0] ) || !( mrows ==1 && ncols==1 ) )

            mexErrMsgTxt( "Input must be a noncomplex scalar double." );

  plhs[0] = mxCreateDoubleMatrix (  mrows,  ncols,  mxREAL );

  x = mxGetPr( prhs[0] );    y = mxGetPr( plhs[0] );  timestwo(y,x);  }

 可在matlab中编译,也可以直接在C++环境中编译: 

1.matlab)用指令mex  timestwo.c编译此文件,然后在MATLAB命令行下调用生成的MEX文件即可。2). VC2008和一般c++一样编译后,就会产生dll,这样可以直接在Matlab中用了,或者copy且更改后缀名.mexw32即可。(因为Matlab R2010b以后版本可能不支持调用dll为后缀的mex文件了

  2.2调用C/C++动态连接库(即:一般普通的C程序dll没有用mex的接口函数)

  Matlab提供对动态连接库DLL文件的接口[7]。利用该接口,可在Matlab中调用动态连接库导出的函数。Matlab

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值