找回密码
 注册
关于网站域名变更的通知
查看: 525|回复: 1
打印 上一主题 下一主题

Matlab与C/C++混合编程接口及应用方法研究

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-12 15:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 cat12620 于 2018-11-12 15:58 编辑
& a2 P" u7 d- h! {9 u; g3 C# p5 \  W2 ?7 ~  {, v# Q

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

% ?6 e" U5 b0 ?3 [/ ~
. j+ Y- W- g1 k3 G$ G

7 g1 j/ l" |7 j$ v+ g" |  q: v! d# s& r" D

    1 引言

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

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

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

    2 Matlab 调用C/C++

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

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

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

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

    2.1 调用C/C++的MEX 文件

    MEX 是Matlab 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 many output 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); }

    用指令mex timestwo.c 编译此文件,然后在MATLAB 命令行下调用生成的MEX 文件即可。

   

    2.2 调用C/C++动态连接库

    Matlab 提供对动态连接库DLL 文件的接口[7]。利用该接口,可在Matlab 中调用动态连 接库导出的函数。Matlab 对DLL 的接口支持各种语言编写的DLL 文件。在调用DLL 文件之 前,需要准备函数定义的头文件。对于C/C++语言开发的DLL 文件,可使用源程序中相应的 头文件;而对于其他语言开发的DLL,则要手工准备等效的C 语言函数定义头文件。


4 y3 e" I9 R! y
: S# ?1 l) S) U& \
2 ]1 Z  z- R( |+ {1 _1 C
游客,如果您要查看本帖隐藏内容请回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-10 20:12 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表