MATLAB与C的混合编程(6)

2019-04-23 13:39

学 士 学 位 论 文

BACHELOR ’S THESIS = 1

1

int row0, col0; int row1, col1;

/ * 检查输入输出变量的个数* / if( nrhs ! = 2)

mexErrMsgT xt( “two input required. ”) ; else

if( nlhs > 1)

mexErrMsgTxt ( “too many output arguments. ”) ; / * 输入的元素必须为两个非复数的double类型数据* / row0= mxGetM( prhs[ 0] ) ; col0= mxGetN( prhs[ 0] ) ;

if ( ! mxIsDouble ( prhs [ 0] ) ? ?mxIsComplex( prhs[ 0] ) ?? ! ( row0 = && col0 = = 1) )mexErrMsgTxt ( “inputs must benocomplex scalar double. ”) ;

row1 = mxGetM( prhs[ 1] ) ;

col1 = mxGetN( prhs[ 1] ) ;

if( ! mxIsDouble( prhs[ 1] ) ?? mxIsComplex( prhs[ 1] ) ??! ( row1 = = && col1 = = 1) )mexErrMsgTxt ( “inputs must benocomplex scalar double. ”) ;

/ * 为返回参数创建矩阵* /

plhs [ 0] = mxCreateDoubleMatrix ( row0,col0, mxREAL) ; / * 为输入输出参数赋值* / x= mxGetPr ( prhs[ 0] ) ; y= mxGetPr( prhs[ 1] ) ; z= mxGetPr( plhs[ 0] ) ; / * 调用C 函数Mul* / Mul( x, y, z) ; }

21

学 士 学 位 论 文

BACHELOR ’S THESIS 这个例子实现的是两个数的相乘, 各个语句的含义请参见注释; 以mx, mex 开头的函数是Matlab与C 的接口函数, 具体用法请参见Matlab 的帮助。该例子的源程序主要由两个不同的部分组成:

1) 计算子程序。它包含了所有实际完成计算功能的源代码, 用来完成实际的计算工作;

2) 入口子程序。它是计算子例行程序Matlab

环境之间的接口, 用来完成两者之间的通信任务。入口子例行程序的名称为mexFunction, 拥有四个参数, 分别为prhs、nrhs、plhs 和nlhs, 其中prhs 为一个

mxArray 结构体类型的指针数组, 该数组的数组元素按顺序指向所有的输入参数; nrhs 为整数类型,它标明了输入参数的个数; plhs 同样为一个mxArray 结构体类型的指针数组, 该数组的数组元素按顺序指向所有的输出参数; nlhs 为整数类型, 它标明了输出参数的个数。[20]

以上两个步骤是典型的C 语言Mex 文件格式。为了能够在Matlab 环境下运行这个程序, 必须首先配置Mex 的编译环境, 其配置工作可在Matlab 环境中运行mex-setup 命令并按提示进行操作。配置之后, 在Matlab 环境下运行mex filename. c 编译C 文件, 然后可在当前目录下看到一个与C 文件同名的dll 文件, 到此为止已经大功告成。在Matlab 环境下键入filename( 2, 3) 看看结果, 检验一下是否正确。

以上是个非常简单的例子。在C 语言编程中经常用到结构, 下面是一个与

数据结构有关的例子。

# include “mex. h” struct Point {

double x; double y; double z; };

void Add( struct Point * p) {

p- > x + + ;

22

学 士 学 位 论 文

BACHELOR ’S THESIS p- > y + + ; p- > z + + ; }

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

const char * fnames[ 3] ; int nfields, n, i; mxArray * tmp; struct Point p1; double * x[ 3] ; if( nrhs ! = 1)

mexErrMsgT xt( “one input required. ”) ; else if( nlhs > 1)

mexErrMsgTxt ( “too many output argument. ”) ; else if( ! mxIsStruct( prhs[ 0] ) )

mexErrMsgTxt ( “input must be astructure. ”) ; / * 求得输入结构体的域数和每个域的元素个数* / nfields= mxGetNumberOfFields( prhs[ 0] ) ; n= mxGetNumberOfElements( prhs[ 0] ) ; for( i= 0; i < nfields; i + + ) / * 获得各域的域名* / fnames [ i] = mxGetFieldNameByNumber( prhs[ 0] , i) ; for( i= 0; i < nfields; i + + ) / * 从输入的结构体中取得数据* / {

tmp = mxGetField ( prhs [ 0] , 0, fnames[ i] ) ; if(mxIsDouble( tmp) ! = 1)

mexErrMsgTxt( “Element is not type of double. ”) ; x[ i] = mxGetPr( tmp) ; }

p1. x = * ( x[ 0] ) ;

23

学 士 学 位 论 文

BACHELOR ’S THESIS p1. y = * ( x[ 1] ) ; p1. z = * ( x[ 2] ) ; Add(&p1) ;

/ * 对输出的结构体矩阵进行初始化并赋值* / plhs [ 0 ] = mxCreateStructMatrix ( 1, 1,nfields, fnames) ; tmp= mxCreateScalarDouble( p1. x) ; mxSetField( plhs[ 0] , 0, fnames[ 0] , tmp) ; tmp= mxCreateScalarDouble( p1. y) ; mxSetField( plhs[ 0] , 0, fnames[ 1] , tmp) ; tmp= mxCreateScalarDouble( p1. z) ; mxSetField( plhs[ 0] , 0, fnames[ 2] , tmp) ; }

这个例子同第一个的格式是一样的, 区别在于一些mx 函数的使用上。对于Matlab 中的结构类型, 其实质还是数组。因此, 不一定非要使用上面的实现方式, 上面的实现方式是考虑到Matlab 的结构类型和C 语言中的结构形式相对应。

上面举的两个例子都是单个文件的, 如果C 函数用到多个文件中的函数, 编译时的格式如下: mexfile1. c file2. c …, 编译后将产生file1. dll 的动态链接库文件, 可在Matlab 工作环境中直接执行。注意:mex 命令可以操作多种文件格式, 包括. c、. obj 和.lib; 在链接多个文件时, 生成的Mex 文件的名字为文件列表中的第一个文件的名字; 在将文件列表时,必须写出文件扩展名, 并且用空格分开。

5. 结语

本文对MATLAB与C语言混合编程的常用方法进行了论述。各种方法各有其优势,又个又不足(如:利用C语言编写的MEX程序,克服了脚本语言速度缓慢的缺点,提高了程序执行的效率,是提高MATLAB程序运行速度的最有效方法,但不能脱离MATLAB;利用MATLAB引擎,可以在C中向MATLAB发送命令,控制MATLAB的运行,这是调用MATLAB最简单、最直接的途径,但要求必须由MATLAB在后台执行引擎发出的命令,不能脱离MATLAB独立运行;利用MATLAB编译器,可以创建脱离MATLAB而独立运行的可执行程

24

学 士 学 位 论 文

BACHELOR ’S THESIS 序,MATLAB编译器支持MATLAB绝大部分功能,但也有些文件是MATLAB编译器不能编译的,同时,独立可执行程序不能调用simulink函数;利用MATCOM技术可将MATLAB源代码译成同等功能的C源代码,既保持了MATLAB的优良算法,又保持了C的高执行效率;等等)。[17][18]

需要MATLAB后台支持的方法可以更好的与MATLAB结合,满足用户更多的需要,但限制了应用程序的普及与推广。独立于MATLAB环境之外的方法可以在满足基本需要的情况下被更好的应用和推广,但功能和方法受限,在实际应用中应根据不同的需要和所处的软硬件环境选择适合的方法,以期达到最佳效果。如果开发系统中考虑到数据传递的实时性,则采用独立于MATLAB环境之外的方法,会取得良好的效果;如果开发系统算法复杂,不要求实时性,则采用需要MATLAB后台支持的方法更好些。[19][21]

将MATLAB丰富的功能与C语言的强大功能相结合的方法,对于熟练掌握高级语言的工程技术人员来说,特别是对从事控制的工程技术人员都有非常重要的现实意义。

25


MATLAB与C的混合编程(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《财务管理》试卷及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: