MbookMATLAB8.docx

上传人:b****4 文档编号:12368361 上传时间:2023-04-18 格式:DOCX 页数:28 大小:251.53KB
下载 相关 举报
MbookMATLAB8.docx_第1页
第1页 / 共28页
MbookMATLAB8.docx_第2页
第2页 / 共28页
MbookMATLAB8.docx_第3页
第3页 / 共28页
MbookMATLAB8.docx_第4页
第4页 / 共28页
MbookMATLAB8.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

MbookMATLAB8.docx

《MbookMATLAB8.docx》由会员分享,可在线阅读,更多相关《MbookMATLAB8.docx(28页珍藏版)》请在冰豆网上搜索。

MbookMATLAB8.docx

MbookMATLAB8

第8章MATLAB高级应用

8.1MATLAB应用接口

8.1.1MEX文件

MEX文件具有以下几个方面的应用:

(1)对于已存在的C或FORTRAN子程序,可以通过MEX文件在MATLAB环境中直接调用,而不必重新编写M文件。

(2)由于MATLAB是解释性语言,运行如for等循环体时,会出现速度十分缓慢的现象,为了能提高速度,往往要使用MEX程序。

(3)对于A/D、D/A卡,或其它PC硬件,可以直接用MEX文件进行访问。

(4)利用MEX文件,可以使用如Windows用户图形界面等资源。

1.MEX文件系统设置

下面采用MicrosoftVisualC/C++6.0编译器,在命令窗口使用“mex-setup”命令,对MEX文件编译器进行配置:

>>mex-setup

则会出现如下提示:

Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:

Wouldyoulikemextolocateinstalledcompilers[y]/n?

y

让用户选择是否同意mex命令自动定位已经安装的编译器,输入“y”后,回车出现如下提示:

Selectacompiler:

[1]DigitalVisualFortranversion6.0inC:

\ProgramFiles\MicrosoftVisualStudio

[2]LccCversion2.4inD:

\MATLAB6P1\sys\lcc

[3]MicrosoftVisualC/C++version6.0inD:

\ProgramFiles\MicrosoftVisualStudio

[0]None

提供用户选择编译器作为默认的MEX文件编译器,通过键盘输入“3”后,回车出现如下提示:

Pleaseverifyyourchoices:

Compiler:

MicrosoftVisualC/C++6.0

Location:

D:

\ProgramFiles\MicrosoftVisualStudio

Arethesecorrect?

([y]/n):

确认所选择的编译器,通过键盘输入“y”后,回车出现如下提示:

Thedefaultoptionsfile:

"D:

\DocumentsandSettings\ZJDCY\ApplicationData\MathWorks\MATLAB\R12\mexopts.bat"

isbeingupdatedfromD:

\MATLAB6P1\BIN\WIN32\mexopts\msvc60opts.bat...

InstallingtheMATLABVisualStudioadd-in...

UpdatedD:

\ProgramFiles\MicrosoftVisualStudio\common\msdev98\template\MATLABWizard.awx

fromD:

\MATLAB6P1\BIN\WIN32\MATLABWizard.awx

UpdatedD:

\ProgramFiles\MicrosoftVisualStudio\common\msdev98\template\MATLABWizard.hlp

fromD:

\MATLAB6P1\BIN\WIN32\MATLABWizard.hlp

UpdatedD:

\ProgramFiles\MicrosoftVisualStudio\common\msdev98\addins\MATLABAddin.dll

fromD:

\MATLAB6P1\BIN\WIN32\MATLABAddin.dll

MergedD:

\MATLAB6P1\BIN\WIN32\usertype.dat

withD:

\ProgramFiles\MicrosoftVisualStudio\common\msdev98\bin\usertype.dat

则表示编译器成功配置。

2.测试配置

在MATLAB环境的当前目录浏览器窗口中,将MATLAB的extern\examples\mex目录设置为当前目录,然后在命令窗口中输入:

mexyprime.c

则在extern\examples\mex目录下,就生成了“yprime.dll”文件,查看该yprime.dll文件的信息,在命令窗口中输入:

>>whichyprime

D:

\MATLAB6p1\extern\examples\mex\yprime.dll

并调用yprime.dll文件:

>>yprime(1,1:

2:

7)

ans=

3.000014.99257.0000-1.0377

3.C语言MEX文件的构成

程序的构成主要由入口子程序和计算功能子程序两部分组成。

(1)入口子程序

第一部分入口子程序的作用是在MATLAB系统与被调用的外部子程序之间建立通信联系。

入口子程序必须是mexFunction,其构成形式为:

voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])

{

/*用来完成MATLAB与计算子程序之间通信任务的代码*/

}

mexFunction函数的参数含义为:

▪nrhs:

为输入参数的数目。

▪prhs:

为输入参数数组,是指针数组。

▪nlhs:

为输出参数的数目。

▪plhs:

为输出参数数组,是指针数组。

(2)计算功能子程序

第二部分为计算功能子程序,包含所有的实际需要完成的功能源代码,可以是用户以前所编写的算法和程序,以函数的形式存在。

4.C语言MEX文件的建立

(1)常用MATLABAPI函数

在MEX文件中,常用MATLABAPI函数有:

▪mxGetM:

获得矩阵的行数。

▪mxGetN:

获得矩阵的列数。

▪mxGetPr:

获得矩阵的实数部分的数据指针。

▪mexErrMsgTxt:

输出错误信息,并返回到MATLAB命令提示符下。

▪mxCreateString:

创建一个字符串矩阵。

▪mxCreateDoubleMatrix:

创建一个二维未赋值的双精度浮点类型的矩阵。

▪mxIsDouble:

判断矩阵是否为双精度类型。

(2)C语言MEX文件的创建步骤

通过创建计算一个数平方倒数值的程序,来介绍一个MEX文件创建的过程。

【例8.1】在MicrosoftVisualC++6.0环境下创建一个MEX文件,实现计算一个数平方的倒数值。

▪在MicrosoftVisualC++6.0环境创建一个“C++SourceFile”文件,文件名为“Ex0801.cpp”。

▪编写该文件的程序代码如下:

#include"mex.h"

#include"math.h"

/*计算功能子程序Ex0801,计算平方的倒数*/

voidEx0801(doubley[],doublex[])

{

y[0]=1/(x[0]*x[0]);

return;

}

/*入口子程序mexFunction*/

voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])

{

double*x,*y;

unsignedintm,n;

/*检查输入变量的个数是否正确*/

if(nrhs!

=1)

{

mexErrMsgTxt("Onlyoneinputargumentallowed.");

}

/*检查输出变量的个数是否正确*/

elseif(nlhs!

=1){

mexErrMsgTxt("Onlyoneoutputargumentallowed.");

}

m=mxGetM(prhs[0]);

n=mxGetN(prhs[0]);

/*检查输入变量必须是非复数单个双精度数*/

if(!

mxIsDouble(prhs[0])||mxIsSparse(prhs[0])||mxIsComplex(prhs[0])||

!

(m==1&&n==1))

{

mexErrMsgTxt("Inputargumentmustbeascalar.");

}

/*创建矩阵变量为输出变量*/

plhs[0]=mxCreateDoubleMatrix(m,n,mxREAL);

y=mxGetPr(plhs[0]);

x=mxGetPr(prhs[0]);

/*调用计算功能子程序*/

Ex0801(y,x);

}

▪在MATLAB命令窗口的当前目录浏览器中将当前目录设置为用户的目录,输入命令创建MEX文件并运行:

mexEx0801.cpp

>>y=Ex0801

(2)

y=

0.2500

扩展名为cpp是C++文件,在其同一文件夹中生成Ex0801.dll文件,运行Ex0801.dll文件的运算结果正确。

▪为该文件添加帮助M文件

为了在MATLAB中可以方便地查看该Ex0801.dll文件的帮助信息,可以建立一个Ex0801.M文件,并输入以下内容:

%functiony=Ex0801(x)

%计算一个数平方的倒数值

%y=1/(x^2)

%copyright@2003-10-10

则在MATLAB命令窗口中,用help命令只能看到M文件来查看帮助信息:

>>helpEx0801

functiony=Ex0801(x)

计算一个数平方的倒数值

y=1/(x^2)

copyright@2003-10-10

8.1.2使用MATLAB编译器生成MEX和EXE文件

1.MEX文件与EXE文件的区别

MEX文件只能在MATLAB环境中运行;而EXE文件是可以独立与MATLAB环境运行的。

2.配置编译器的准备

如果要创建MEX文件,如图8.1所示。

则只需勾选“MATLABCompiler”;如果要创建EXE文件,则需要勾选如图中的三个选项。

3.由M文件创建CMEX文件

利用MATLAB编译器来由M文件创建MEX文件,使用“mcc–x”命令,。

【例8.2】在MATLAB环境中创建一个M函数文件,用来绘制正弦信号波形。

在MATLAB的编辑/调试窗口中创建一个Ex0802.m函数文件,编写程序代码如下:

functionEx0802

%Ex0802绘制正弦信号波形

x=0:

0.1:

2*pi;

y=sin(x);

plot(x,y)

保存文件,在MATLAB命令窗口中由该M文件创建MEX文件:

>>mcc-xEx0802%创建Ex0802.dll文件

>>Ex0802%运行Ex0802.dll文件

运行该Ex0802.dll文件,绘制出正弦信号波形图。

在该目录下,可以看到在创建dll文件的同时,还创建了Ex0802.c、Ex0802.h和Ex0802_mex.c文件。

注意:

如果上述的Ex0802.m文件删除第一行,变为M脚本文件,则用mcc命令直接编译会出错,并出现如下提示:

>>mcc-xEx0802

?

?

?

Error:

CannotcreateMEXFile"Ex0802"fromMEXFile"C:

\MyDocuments\CAOYi\BookMATLAB\20031008\exe\Ex0802.dll".

Errorin==>D:

\MATLAB6p1\toolbox\compiler\mcc.dll

4.创建独立的外部程序EXE文件

【例8.3】第一次使用mbuild命令由C文件创建EXE文件。

由“matlab\extern\examples\cmath”目录下的现成文件“ex1.c”,创建独立的EXE文件。

先将“matlab\extern\examples\cmath”目录设置为当前目录,然后输入mbuild命令,由于系统中安装了LCC和MicrosoftVisualC/C++两个编译器,则MATLAB会提示用户选择默认的编译器:

>>mbuildex1.c

PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:

Wouldyoulikembuildtolocateinstalledcompilers[y]/n?

y

选择一个默认的编译器

Selectacompiler:

[1]LccCversion2.4inD:

\MATLAB6P1\sys\lcc

[2]MicrosoftVisualC/C++version6.0inD:

\ProgramFiles\MicrosoftVisualStudio

[0]None

Compiler:

2

……

后面就会出现提示和确认的信息。

如果要改变默认的编译器,则需要使用“mbuild-setup”命令重新选择。

(1)mbuild命令由C文件生成EXE文件

【例8.3续】用mbuild命令由C文件编译生成EXE文件。

使用mbuild命令可以由“ex1.c”文件创建独立的可执行文件:

>>mbuildex1.c

则产生了“ex1.exe”文件,可以脱离MATLAB独立运行,同时在同一目录下还产生了“bin”文件夹。

(2)mcc命令由M文件生成EXE文件

【例8.4】用mcc命令由【例8.2】中的M文件编译生成EXE文件。

>>mcc-BsglcppEx0802.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为返回的文件指针(FileIdentifier),通常是一个非负的整数,如果返回-1,则表示无法打开文件;message用来显示打开文件的信息,如果无法打开,则显示错误信息;filename为文件名,是字符串,如果文件不在MATLAB的搜索路径中,则需要指定文件路径;permission为指定文件的打开模式,有以下几种模式:

▪'r':

只读文件

▪'r+':

读写文件

▪'w':

删除已存在文件内容或建立新文件,并只写文件

▪'w+':

删除已存在文件内容或建立新文件,并读写文件

▪'a':

以只写方式建立并打开一个新文件或打开一个已存在的文件,只能在文件末尾添加内容

▪'a+':

以读写方式建立并打开一个新文件或打开一个已存在的文件,在文件末尾添加内容

fopen的permission参数在打开文件时还可标明文件格式,如果打开文本格式文件,在后添加字母“t”,如果打开二进制格式文件,则在permission参数后添加字母“b”,如'wb'、'rb+'等。

2.关闭文件

打开文件进行读写操作后,应立即关闭文件,删除文件指针。

语法:

status=fclose(fid)%关闭文件指针所指的文件

status=fclose('all')%关闭所有打开的文件

说明:

status为关闭文件指针所指文件的状态,如果成功则返回0,如果失败则返回-1;fid为所打开的文件指针。

【例8.5】打开和关闭一个文本文件。

文本文件“Ex0805.txt”,在MATLAB环境中显示的文件内容如下:

typeEx0805.txt

a123

b456

使用fopen和fclose命令打开和关闭文件:

[fid,message]=fopen('Ex0805.txt','w+')%打开文件读写

fid=

3

message=

''

iffid==-1

disp('无法打开该文件')

else

disp('成功打开该文件')

end

成功打开该文件

status=fclose(fid)%关闭文件

status=

0

8.2.2读写格式化文件

1.fscanf命令

fscanf命令为读格式化文件数据。

语法:

[a,count]=fscanf(fid,format,size)%读取格式化数据

说明:

fid为文件指针,所指为需要读取的格式化文件;format指定读取数据格式,指定的格式必须和文件中的数据格式相同,否则读取的数据可能会出现错误,以“%”开头,有%c、%d、%e、%f、%g、%i、%o、%s、%u、%x等(与C语言相同);count为成功读取的数据元素个数,可省略;a返回读取的数据;size为需要读取的数据个数,如果省略,则读到文件末尾,size的取值可以有:

▪n:

读n个数据到一个列向量

▪inf:

读到文件末尾,数据放到一个列向量

▪[m,n]:

读出的数据个数为m×n,数据放到矩阵中,读出的数据按列的顺序填充矩阵,不够的数据用0填补。

【例8.5续】读取Ex0805.txt文件的前四个字符。

fid=fopen('Ex0805.txt')

fid=

3

a1=fscanf(fid,'%s',4)%以字符串格式读取四个数据

a1=

a123

fclose(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='%Thisisaexample.';

fid=fopen('Ex0805.txt','a+')%打开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

程序分析:

在向文件中写入数据后,先关闭文件,然后再打开文件则从文件开头读取数据,如果写完数据后直接读取数据,则实际读取数据的位置将从写入的最后一个数据之后开始。

3.fgetl和fgets命令

fgetl和fgets命令都是用来读取文件的下一行,两者的差别是fgetl会舍去换行符,而fgets则保留换行符。

语法:

tline=fgetl(fid)%读取文件的下一行,不包括换行符

tline=fgets(fid)%读取文件的下一行,包括换行符

tline=fgets(fid,nchar)%限制读取文件字符个数

说明:

fid为文件指针;tline为以字符串形式的返回值,如果到文件末尾则返回-1;nchar为最多返回的字符个数。

【例8.6续】以行的形式读取Ex0805.txt文件。

fid=fopen('Ex0805.txt','r');%打开Ex0803.txt文件只读

fgetl(fid)%读取第一行数据

ans=

a123

fgets(fid)%读取第二行数据

ans=

b456

fgets(fid,10)%读取第三行数据,限制10个字符

ans=

%Thisisa

fgets(fid,10)

ans=

example.%

8.2.3读写二进制数据

fread命令为读二进制数据。

语法:

[a,count]=fread(fid,size,precision,skip)%读取二进制数据

说明:

fid为文件指针;size与fscanf命令含义相同;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命令相同;count为成功写入数据的个数。

【例8.7】写入数据到MAT文件中,并读取数据。

x1=1:

10;

[fid,message]=fopen('Ex0805.mat','a')%打开文件添加数据

fid=

4

message=

''

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=

13579

246810

a2=fread(fid,[1,5])

a2=

12345

fclose(fid);

8.2.4文件定位

1.fseek

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 >

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

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