ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:251.53KB ,
资源ID:12368361      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12368361.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MbookMATLAB8.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MbookMATLAB8.docx

1、MbookMATLAB8第8章MATLAB高级应用8.1 MATLAB应用接口8.1.1 MEX文件MEX文件具有以下几个方面的应用:(1) 对于已存在的C或FORTRAN子程序,可以通过MEX文件在MATLAB环境中直接调用,而不必重新编写M文件。(2) 由于MATLAB是解释性语言,运行如for等循环体时,会出现速度十分缓慢的现象,为了能提高速度,往往要使用MEX程序。(3) 对于A/D、D/A卡,或其它PC硬件,可以直接用MEX文件进行访问。(4) 利用MEX文件,可以使用如Windows用户图形界面等资源。1. MEX文件系统设置下面采用Microsoft Visual C/C+ 6.

2、0编译器,在命令窗口使用“mex -setup”命令,对MEX文件编译器进行配置: mex -setup则会出现如下提示:Please choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers y/n? y让用户选择是否同意mex命令自动定位已经安装的编译器,输入“y”后,回车出现如下提示:Select a compiler: 1 Digital Visual Fortran version 6.0 in C:Program

3、 FilesMicrosoft Visual Studio 2 Lcc C version 2.4 in D:MATLAB6P1syslcc 3 Microsoft Visual C/C+ version 6.0 in D:Program FilesMicrosoft Visual Studio 0 None 提供用户选择编译器作为默认的MEX文件编译器,通过键盘输入“3”后,回车出现如下提示: Please verify your choices: Compiler: Microsoft Visual C/C+ 6.0 Location: D:Program FilesMicrosoft V

4、isual Studio Are these correct?(y/n): 确认所选择的编译器,通过键盘输入“y”后,回车出现如下提示:The default options file: D:Documents and SettingsZJDCYApplication DataMathWorksMATLABR12mexopts.bat is being updated from D:MATLAB6P1BINWIN32mexoptsmsvc60opts.bat. Installing the MATLAB Visual Studio add-in . Updated D:Program File

5、sMicrosoft Visual Studiocommonmsdev98templateMATLABWizard.awx from D:MATLAB6P1BINWIN32MATLABWizard.awx Updated D:Program FilesMicrosoft Visual Studiocommonmsdev98templateMATLABWizard.hlp from D:MATLAB6P1BINWIN32MATLABWizard.hlp Updated D:Program FilesMicrosoft Visual Studiocommonmsdev98addinsMATLABA

6、ddin.dll from D:MATLAB6P1BINWIN32MATLABAddin.dll Merged D:MATLAB6P1BINWIN32usertype.dat with D:Program FilesMicrosoft Visual Studiocommonmsdev98binusertype.dat 则表示编译器成功配置。2. 测试配置在MATLAB环境的当前目录浏览器窗口中,将MATLAB的externexamplesmex目录设置为当前目录,然后在命令窗口中输入: mex yprime.c 则在externexamplesmex目录下,就生成了“yprime.dll”文件

7、,查看该yprime.dll文件的信息,在命令窗口中输入: which yprimeD:MATLAB6p1externexamplesmexyprime.dll并调用yprime.dll文件: yprime(1,1:2:7)ans = 3.0000 14.9925 7.0000 -1.03773. C语言MEX文件的构成程序的构成主要由入口子程序和计算功能子程序两部分组成。(1) 入口子程序第一部分入口子程序的作用是在MATLAB系统与被调用的外部子程序之间建立通信联系。入口子程序必须是mexFunction,其构成形式为:void mexFunction( int nlhs, mxArray

8、 *plhs, int nrhs, const mxArray*prhs ) /*用来完成MATLAB与计算子程序之间通信任务的代码*/mexFunction函数的参数含义为: nrhs:为输入参数的数目。 prhs:为输入参数数组,是指针数组。 nlhs:为输出参数的数目。 plhs:为输出参数数组,是指针数组。(2) 计算功能子程序第二部分为计算功能子程序,包含所有的实际需要完成的功能源代码,可以是用户以前所编写的算法和程序,以函数的形式存在。4. C语言MEX文件的建立(1) 常用MATLAB API函数在MEX文件中,常用MATLAB API函数有: mxGetM:获得矩阵的行数。 m

9、xGetN:获得矩阵的列数。 mxGetPr:获得矩阵的实数部分的数据指针。 mexErrMsgTxt:输出错误信息,并返回到MATLAB命令提示符下。 mxCreateString:创建一个字符串矩阵。 mxCreateDoubleMatrix:创建一个二维未赋值的双精度浮点类型的矩阵。 mxIsDouble:判断矩阵是否为双精度类型。(2) C语言MEX文件的创建步骤通过创建计算一个数平方倒数值的程序,来介绍一个MEX文件创建的过程。【例8.1】在Microsoft Visual C+6.0环境下创建一个MEX文件,实现计算一个数平方的倒数值。 在Microsoft Visual C+6.

10、0环境创建一个“C+ Source File”文件,文件名为“Ex0801.cpp”。 编写该文件的程序代码如下:#include mex.h#include math.h/*计算功能子程序Ex0801,计算平方的倒数*/void Ex0801(double y,double x) y0=1/(x0*x0); return;/*入口子程序mexFunction*/void mexFunction(int nlhs,mxArray *plhs,int nrhs,const mxArray *prhs) double *x,*y; unsigned int m,n; /*检查输入变量的个数是否正确

11、*/ if(nrhs!=1) mexErrMsgTxt(Only one input argument allowed.); /*检查输出变量的个数是否正确*/ else if(nlhs!=1) mexErrMsgTxt(Only one output argument allowed.); m = mxGetM(prhs0); n = mxGetN(prhs0); /*检查输入变量必须是非复数单个双精度数*/ if (!mxIsDouble(prhs0) | mxIsSparse(prhs0) |mxIsComplex(prhs0)| ! (m=1&n=1) mexErrMsgTxt(Inp

12、ut argument must be a scalar.); /*创建矩阵变量为输出变量*/ plhs0=mxCreateDoubleMatrix(m,n,mxREAL); y = mxGetPr(plhs0); x = mxGetPr(prhs0); /*调用计算功能子程序*/ Ex0801(y,x); 在MATLAB命令窗口的当前目录浏览器中将当前目录设置为用户的目录,输入命令创建MEX文件并运行: mex Ex0801.cpp y=Ex0801(2)y = 0.2500扩展名为cpp是C+文件,在其同一文件夹中生成Ex0801.dll文件,运行Ex0801.dll文件的运算结果正确。

13、为该文件添加帮助M文件为了在MATLAB中可以方便地查看该Ex0801.dll文件的帮助信息,可以建立一个Ex0801.M文件,并输入以下内容:%function y=Ex0801(x)%计算一个数平方的倒数值% y=1/(x2)% copyright 2003-10-10则在MATLAB命令窗口中,用help命令只能看到M文件来查看帮助信息: help Ex0801 function y=Ex0801(x) 计算一个数平方的倒数值 y=1/(x2) copyright 2003-10-108.1.2 使用MATLAB编译器生成MEX和EXE文件1. MEX文件与EXE文件的区别MEX文件只能

14、在MATLAB环境中运行;而EXE文件是可以独立与MATLAB环境运行的。2. 配置编译器的准备如果要创建MEX文件,如图8.1所示。则只需勾选“MATLAB Compiler”;如果要创建EXE文件,则需要勾选如图中的三个选项。3. 由M文件创建C MEX文件利用MATLAB编译器来由M文件创建MEX文件,使用“mcc x”命令,。【例8.2】在MATLAB环境中创建一个M函数文件,用来绘制正弦信号波形。在MATLAB的编辑/调试窗口中创建一个Ex0802.m函数文件,编写程序代码如下:function Ex0802% Ex0802 绘制正弦信号波形x=0:0.1:2*pi;y=sin(x)

15、;plot(x,y)保存文件,在MATLAB命令窗口中由该M文件创建MEX文件: mcc -x Ex0802 %创建Ex0802.dll文件 Ex0802 %运行Ex0802.dll文件运行该Ex0802.dll文件,绘制出正弦信号波形图。在该目录下,可以看到在创建dll文件的同时,还创建了Ex0802.c、Ex0802.h和Ex0802_mex.c文件。注意:如果上述的Ex0802.m文件删除第一行,变为M脚本文件,则用mcc命令直接编译会出错,并出现如下提示: mcc -x Ex0802? Error: Cannot create MEX File Ex0802 from MEX File

16、 C:My DocumentsCAOYiBookMATLAB20031008exeEx0802.dll.Error in = D:MATLAB6p1toolboxcompilermcc.dll4. 创建独立的外部程序EXE文件【例8.3】第一次使用mbuild命令由C文件创建EXE文件。由“matlabexternexamplescmath”目录下的现成文件“ex1.c”,创建独立的EXE文件。先将“matlabexternexamplescmath”目录设置为当前目录,然后输入mbuild命令,由于系统中安装了LCC和Microsoft Visual C/C+两个编译器,则MATLAB会提示

17、用户选择默认的编译器: mbuild ex1.cPlease choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers y/n? y 选择一个默认的编译器Select a compiler: 1 Lcc C version 2.4 in D:MATLAB6P1syslcc 2 Microsoft Visual C/C+ version 6.0 in D:Program FilesMicrosoft Visual Stu

18、dio 0 None Compiler: 2后面就会出现提示和确认的信息。如果要改变默认的编译器,则需要使用“mbuild -setup”命令重新选择。(1) mbuild命令由C文件生成EXE文件【例8.3续】用mbuild命令由C文件编译生成EXE文件。使用mbuild命令可以由“ex1.c”文件创建独立的可执行文件: mbuild ex1.c则产生了“ex1.exe”文件,可以脱离MATLAB独立运行,同时在同一目录下还产生了“bin”文件夹。(2) mcc命令由M文件生成EXE文件【例8.4】用mcc命令由【例8.2】中的M文件编译生成EXE文件。 mcc -B sglcpp Ex08

19、02.m %创建需要图形库的C+独立应用程序如果不希望MCC自动调用mbuild,可以添加使用“-c”选项,如命令“mcc -mc”和“mcc -pc”。8.2 低级文件的输入输出8.2.1打开和关闭文件1. 打开文件语法: fid = fopen(filename,permission) %以指定格式打开文件 fid,message = fopen(filename,permission) %返回打开文件的信息说明:fid为返回的文件指针(File Identifier),通常是一个非负的整数,如果返回-1,则表示无法打开文件;message用来显示打开文件的信息,如果无法打开,则显示错误信

20、息;filename为文件名,是字符串,如果文件不在MATLAB的搜索路径中,则需要指定文件路径;permission为指定文件的打开模式,有以下几种模式: r:只读文件 r+:读写文件 w:删除已存在文件内容或建立新文件,并只写文件 w+:删除已存在文件内容或建立新文件,并读写文件 a:以只写方式建立并打开一个新文件或打开一个已存在的文件,只能在文件末尾添加内容 a+:以读写方式建立并打开一个新文件或打开一个已存在的文件,在文件末尾添加内容fopen的permission参数在打开文件时还可标明文件格式,如果打开文本格式文件,在后添加字母“t”,如果打开二进制格式文件,则在permissio

21、n参数后添加字母“b”,如wb、rb+等。2. 关闭文件打开文件进行读写操作后,应立即关闭文件,删除文件指针。语法:status=fclose(fid) %关闭文件指针所指的文件status=fclose(all) %关闭所有打开的文件说明:status为关闭文件指针所指文件的状态,如果成功则返回0,如果失败则返回-1;fid为所打开的文件指针。【例8.5】打开和关闭一个文本文件。文本文件“Ex0805.txt”,在MATLAB环境中显示的文件内容如下: type Ex0805.txt a 1 2 3 b 4 5 6使用fopen和fclose命令打开和关闭文件: fid,message=fo

22、pen(Ex0805.txt,w+) %打开文件读写 fid = 3message = if fid=-1disp(无法打开该文件)elsedisp(成功打开该文件)end 成功打开该文件 status=fclose(fid) %关闭文件 status = 0 8.2.2读写格式化文件1. fscanf命令fscanf命令为读格式化文件数据。语法: a,count=fscanf(fid,format,size) %读取格式化数据说明:fid为文件指针,所指为需要读取的格式化文件;format指定读取数据格式,指定的格式必须和文件中的数据格式相同,否则读取的数据可能会出现错误,以“%”开头,有%

23、c、%d、%e、%f、%g、%i、%o、%s、%u、%x等(与C语言相同);count为成功读取的数据元素个数,可省略;a返回读取的数据;size为需要读取的数据个数,如果省略,则读到文件末尾,size的取值可以有: n:读n个数据到一个列向量 inf:读到文件末尾,数据放到一个列向量 m,n:读出的数据个数为mn,数据放到矩阵中,读出的数据按列的顺序填充矩阵,不够的数据用0填补。【例8.5续】读取Ex0805.txt文件的前四个字符。 fid=fopen(Ex0805.txt) fid = 3 a1=fscanf(fid,%s,4) %以字符串格式读取四个数据 a1 =a123 fclose

24、(fid) ans = 0 2. fprintf命令fprintf命令为写格式化数据。语法: count=fprintf(fid,format,a,) %写入格式化数据说明:fid为文件指针,所指为二进制文件;a为矩阵数据,将a写到fid指向的文件;format为写入的格式,除了包含fscanf命令的数据格式之外,还有%E、%G、%X,并具有对齐格式-(左对齐)、+(右对齐)、0(补齐位数),还有转义字符;count为成功写入数据的个数。【例8.6】使用Ex0805.txt文件进行读取和写入数据。a=%This is a example.;fid=fopen(Ex0805.txt,a+) %打

25、开Ex0803.txt文件在末尾添加 fid = 3 fprintf(fid,%s,a) %写入a到文件末尾 ans = 19 fclose(fid) %关闭文件 ans = 0 fid=fopen(Ex0805.txt,r) %打开Ex0803.txt文件只读 fid = 3 fscanf(fid,%s) %读取文件所有内容 ans =a123b456%Thisisaexample.%Thisisaexample.%Thisisaexample.%Thisisaexample. fclose(fid) ans = 0 程序分析:在向文件中写入数据后,先关闭文件,然后再打开文件则从文件开头读取

26、数据,如果写完数据后直接读取数据,则实际读取数据的位置将从写入的最后一个数据之后开始。3. fgetl和fgets命令fgetl和fgets命令都是用来读取文件的下一行,两者的差别是fgetl会舍去换行符,而fgets则保留换行符。语法: tline=fgetl(fid) %读取文件的下一行,不包括换行符 tline=fgets(fid) %读取文件的下一行,包括换行符 tline=fgets(fid,nchar) %限制读取文件字符个数说明:fid为文件指针;tline为以字符串形式的返回值,如果到文件末尾则返回-1;nchar为最多返回的字符个数。【例8.6续】以行的形式读取Ex0805.

27、txt文件。 fid=fopen(Ex0805.txt,r) ; %打开Ex0803.txt文件只读 fgetl(fid) %读取第一行数据 ans =a 1 2 3 fgets(fid) %读取第二行数据 ans =b 4 5 6 fgets(fid,10) %读取第三行数据,限制10个字符 ans =%This is a fgets(fid,10) ans = example.% 8.2.3读写二进制数据fread命令为读二进制数据。语法: a,count=fread(fid,size,precision,skip) %读取二进制数据说明:fid为文件指针;size与fscanf命令含义相

28、同;precision为一个字符串,用来指定读取数据的精度,即数据类型,有uchar、schar、int8、int16、int32、int64、unit8、unit16、unit32、unit64、single、float32、double、float64等,可省略;a为矩阵数据;count为成功读取的数据元素个数,可省略;skip为每读取一个数据后跳过的字节数,可省略。2. 写数据fwrite命令为写二进制数据。语法: count=fwrite(fid,a,precision,skip) %写二进制数据说明:fid为文件指针;a为矩阵数据;precision和skip参数含义与fread命令

29、相同;count为成功写入数据的个数。【例8.7】写入数据到MAT文件中,并读取数据。 x1=1:10; fid,message=fopen(Ex0805.mat,a) %打开文件添加数据 fid = 4message = count1=fwrite(fid,x1) %写入数据 count1 = 10 x2=11:15; count2=fwrite(fid,x2) %添加数据 count2 = 5 status=fclose(fid); fid=fopen(Ex0805.mat,r); %打开文件只读 a1=fread(fid,2,5) %读取数据 a1 = 1 3 5 7 9 2 4 6 8 10 a2=fread(fid,1,5) a2 = 1 2 3 4 5 fclose(fid); 8.2.4文件定位1. fseek

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1