第八章MATLAB高级应用.docx
- 文档编号:10196173
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:23
- 大小:251.52KB
第八章MATLAB高级应用.docx
《第八章MATLAB高级应用.docx》由会员分享,可在线阅读,更多相关《第八章MATLAB高级应用.docx(23页珍藏版)》请在冰豆网上搜索。
第八章MATLAB高级应用
第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.fsee
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 MATLAB 高级 应用