1、第12章MATLAB应用接口【本章学习目标】掌握MATLAB与Excel的混合使用方法。掌握MATLAB数据接口的使用方法。了解MATLAB编译器的使用方法。了解MATLAB与其他语言的应用接口。12.1 MATLAB与Excel的接口Spreadsheet Link插件是MATLAB提供的Excel与MATLAB的接口,通过Spreadsheet Link,可以在Excel工作区和MATLAB工作区之间进行数据交换1Spreadsheet Link的安装与启动Spreadsheet Link的安装是在MATLAB安装过程中,随其他组件一起安装的。安装完成后,还需要在Excel中进行一些设置。
2、“加载宏”对话框的“可用加载项”列表中多了一个“Spreadsheet Link 3.3.2 for use with MATLAB and Excel”选项12.1.1 在Excel中导出/导入数据12.1 MATLAB与Excel的接口1Spreadsheet Link的安装与启动在Excel窗口的“开始”选项卡的工具栏右端多了一个MATLAB命令按钮,该命令按钮下拉列表包含的命令如表12.1.1 在Excel中导出/导入数据12.1 MATLAB与Excel的接口2Spreadsheet Link的主要功能和操作(1)将Excel表格中的数据导出到MATLAB工作空间中在Excel中选中
3、需要的数据,在“开始”选项卡的MATLAB命令组的下拉列表中选择“Send data to MATLAB”命令。(2)从MATLAB工作空间导入数据到Excel表格中在Excel中选中要导入数据的起始单元格,在“开始”选项卡的MATLAB命令组的下拉列表中选择“Get data from MATLAB”命令。12.1.1 在Excel中导出/导入数据12.1 MATLAB与Excel的接口在“开始”选项卡的MATLAB命令组的下拉列表中选“MATLAB Function Wizard”命令在“Select a category”栏内选择函数的类别,在“Select a function”栏选择
4、函数,在“Select a function signature”栏选择一种调用方法在“Function Arguments”对话框中设置函数的输入、输出参数。12.1.2 在Excel中调用MATLAB函数12.1 MATLAB与Excel的接口1导入工具从Excel文件、分隔文本文件和等宽的文本文件中导入数据。在MATLAB桌面的主页选项卡中单击“变量”命令组中的“导入数据”按钮,或在命令行窗口输入命令:uiimport(数据文件名)12.1.3 在MATLAB中导入/导出数据12.1 MATLAB与Excel的接口2读写读写ExcelExcel文件的文件的MATLABMATLAB函数函数
5、(1)xlsread函数用于读取Excel文件,调用格式为:filename指定要读取的文件;选项sheet指定要读取的工作表,默认读取Excel文件的第一个工作表;选项xlRange指定要读取的区域12.1.3 在MATLAB中导入/导出数据num,txt,raw,custom=xlsread(filename,sheet,xlRange,processFcn)12.1 MATLAB与Excel的接口2读写读写ExcelExcel文件的文件的MATLABMATLAB函数函数(2)xlswrite函数用于将数据写入Excel文件,调用格式为:filename指定要写入数据的文件,A是存储数据的
6、MATLAB变量;选项sheet指定要写的工作表,默认写入Excel文件的第一个工作表;选项xlRange指定要写的区域12.1.3 在MATLAB中导入/导出数据status,message=xlswrite(filename,A,sheet,xlRange)12.2 文件操作MATLAB提供了一系列访问自由格式文件的函数1文件打开与关闭(1)fopen函数用于打开文件以供读写,调用格式为fid=fopen(filename,permission)filename指定待操作的文件名,文件名可带路径,默认文件位于当前文件夹;permission用于指定对文件的访问方式,默认为r。fid为文件识
7、别号。例如:12.2.1 文件输入/输出操作%以文本模式打开文件old.txt,允许进行读操作F1=fopen(old.txt,rt)%在以二进制模式打开可供读写的文件new.datF2=fopen(new.dat,w+)12.2 文件操作1文件打开与关闭(1)fopen函数12.2.1 文件输入/输出操作文件打开后,默认以二进制模式读写数据,若要以文本模式读写文件,则需在参数值后加t,如rt、wt等12.2 文件操作2文本文件的读写(1)fprintf函数将数据按指定格式写入到文本文件中。调用格式为count=fprintf(fid,fmt,A1,.,An)fid为文件识别号,默认为1,即输
8、出到屏幕。fmt用以控制输出数据的格式。A1,.,An为存储数据的MATLAB变量。count返回成功写入文件的字节数。12.2.1 文件输入/输出操作12.2 文件操作2文本文件的读写(1)fprintf函数12.2.1 文件输入/输出操作数据格式描述符12.2 文件操作r=1:0.1:2;A=pi*r.*r;Y=r;A;fid=fopen(file1.txt,wt);fprintf(fid,%6.2f%12.8fn,Y);fclose(fid);n表示换行符,r 表示回车符t 表示水平制表符v 表示垂直制表符。12.2 文件操作2文本文件的读写(2)fscanf函数用于读取文本文件,并按指
9、定格式存入MATLAB变量。调用格式为A,count=fscanf(fid,fmt,size)fid为文件识别号,fmt用于控制读取的数据格式,size指定读取多少数据。size的可取值如下。Inf:表示一致读取到文件尾,默认值是Inf。n:表示最多读取n个数据。m,nA用于存放读取的数据,count返回成功读取的字符个数。12.2.1 文件输入/输出操作12.2 文件操作【例12.2】将整数1200写入文件file2.txt,每行放置5个数据,数据之间用空格分隔。然后重新打开文件,用不同格式读取数据。u=1:200;fid=fopen(file2.txt,wt);fprintf(fid,%d
10、%d%d%d%dn,u);fclose(fid);fid=fopen(file2.txt,rt);%从当前位置读取100个整数,存入列向量xx=fscanf(fid,%d,10);%从当前位置读取100个整数,存入1010矩阵yy=fscanf(fid,%d,10,10);%从当前位置读取4个数据,存储为一个字符串A=fscanf(fid,%s,4);%从当前位置读取后面的所有数据,生成一个2行的矩阵C=fscanf(fid,%g%g,2 inf);12.2 文件操作2文本文件的读写(3)fgetl与fgets函数用于按行读取数据。调用格式为:tline=fgetl(fid)tline=fge
11、ts(fid,nchar)fgetl函数读入数据时去掉了文件中的换行符fgets函数读入数据时保留了文件中的换行符。fgets函数的选项nchar指定最多读取的字符个数。tline是一个字符向量,存储读取的数据,若文件为空或读到文件尾,则tline返回-1。12.2.1 文件输入/输出操作12.2 文件操作【例12.312.3】读出并显示例12.1生成的文件file1.txt中的数据。fid=fopen(file1.txt,rt);tline=fgetl(fid);%读取第1行数据while tline=-1%判断是否读到文件尾 disp(tline);tline=fgetl(fid);end
12、 fclose(fid);12.2 文件操作2文本文件的读写(4)textscan函数用于读取多种类型数据重复排列、但非规范格式的文件。调用格式为C=textscan(fid,fmt,N,param,value)fid为文件识别号,fmt用以控制读取的数据格式。选项N指定重复使用该格式的次数。选项param与value成对使用,param指定操作属性,value是属性值。12.2.1 文件输入/输出操作12.2 文件操作【例12.4】假定文件file4.txt中有以下格式的数据fid=fopen(file4.txt,rt);grades=textscan(fid,%s%d%d%d,3,head
13、erlines,1);12.2 文件操作3二进制文件的读写二进制文件中的数据为二进制编码,例如图片文件、视频文件,数据在读写时采用二进制模式,不需要转换类型,因此对于大量数据的读写,二进制文件比文本文件更小,读写效率更高。(1)fread函数用于读取二进制文件中的数据。调用格式为A,count=fread(fid,size,precision,skip)fid为文件识别号;选项size用于指定读入数据的元素数量,默认读取整个文件内容;选项precision指定读写数据的精度;选项skip称为循环因子,若skip值不为1,则按skip指定的比例周期性地跳过一些数据,默认为0。A用于存放读取的数据
14、,count返回所读取的数据个数。12.2.1 文件输入/输出操作12.2 文件操作【例12.512.5】假设文件alphabet.txt的内容是按顺序排列的26个小写英文字母,读取并显示前5个字母的ASCII码和这5个字符。%以二进制模式读取数据fid=fopen(alphabet.txt,r);c1=fread(fid,5);display(c1)fclose(fid);%以文本模式读取数据fid=fopen(alphabet.txt,rt);c2=fgets(fid,5);display(c2)fclose(fid);12.2 文件操作3二进制文件的读写(2)fwrite函数用于将数据用
15、二进制模式写入文件。调用格式为count=fwrite(fid,A,precision,skip)fid为文件识别号,A是存储了数据的变量;选项precision用于控制数据输出的精度,默认按列顺序以8位无符号整数的形式写入文件;选项skip控制每次执行写入操作跳过的字节数,默认为0。count返回成功写入文件的数据个数。12.2.1 文件输入/输出操作12.2 文件操作【例12.612.6】建立一数据文件magic5.dat,用于存放5阶魔方阵。fid=fopen(magic5.dat,w);cnt=fwrite(fid,magic(5),int32);fclose(fid);下列程序则可实
16、现对数据文件magic5.dat的读操作。fid=fopen(magic5.dat,r);B,cnt=fread(fid,5,inf,int32)fclose(fid);12.2 文件操作4 4其他文件操作其他文件操作(1)fseek函数用于定位文件位置指针,调用格式为status=fseek(fid,offset,origin)fid为文件识别号;offset表示位置指针相对移动的字节数,若为正整数表示向文件尾方向移动,若为负整数表示向文件头方向移动;origin表示位置指针移动的参照位置,可取值有3种:cof 或0表示文件指针的当前位置,bof 或1表示文件的开始位置,eof或1表示文件的
17、结束位置。若操作成功,status返回值为0,否则返回值为1。12.2.1 文件输入/输出操作fseek(fid,0,-1)%指针移动到文件头 fseek(fid,-5,eof)%指针移动到文件尾倒数第5个字节 12.2 文件操作4 4其他文件操作其他文件操作(2)frewind函数用来将文件位置指针移至文件首,调用格式为:frewind(fid)(3)ftell函数用来查询文件位置指针的当前位置,调用格式为position=ftell(fid)position返回位置指针的当前位置。若查询成功,返回从文件头到指针当前位置的字节数;若查询不成功,返回1。12.2.1 文件输入/输出操作12.2
18、 文件操作4 4其他文件操作其他文件操作(4)feof函数用来判断当前的文件位置指针是否到达文件尾,调用格式为 status=feof(fid)当到达文件尾时,结果为1,否则返回0。(5)ferror函数用来查询最近一次输入或输出操作中的出错信息,调用格式为:message,errnum=ferror(fid,clear)clear用于清除文件的错误指示符。message返回最近的输入/输出操作的错误消息;errnum用于返回错误代号,若errnum为0表示最近的操作成功。12.2.1 文件输入/输出操作12.2 文件操作1 1MATMAT文件文件MAT文件是MATLAB存储数据的标准格式,在
19、MAT文件中不仅保存变量的值,而且保存了变量的名称、大小、数据类型等信息。MAT文件的数据单元分为标志和数据两个部分,标志包含数据类型、数据大小等信息。save命令将工作区的数据保存为MAT文件load命令读取MAT文件中的数据并加载到工作区。12.2.2 MAT文件12.2 文件操作2.MAT2.MAT文件的基本操作文件的基本操作在C+程序中,通过指向MAT文件的指针对文件进行操作。定义指向MAT文件的指针的格式为:MATFile*mfp;MATFile指定指针类型,mfp为指针变量。MATFile类型是在头文件mat.h中定义的,因此,C+程序首部要使用命令:#include mat.h1
20、2.2.2 MAT文件12.2 文件操作2.MAT2.MAT文件的基本操作文件的基本操作在其他语言程序中,通过调用MAT函数对MAT文件进行操作。文件操作分成3步:(1)打开MAT文件。matOpen函数用于打开MAT文件,调用格式如下。mfp=matOpen(filename,mode)mode常用值如下,默认为r。r:以只读方式打开文件。“u”:以更新方式打开文件,可读可写。w:以写方式打开一个文件。12.2.2 MAT文件12.2 文件操作2.MAT2.MAT文件的基本操作文件的基本操作(2)读写MAT文件 将数据写入MAT文件的函数matPutVariable函数用于将数据写入MAT文
21、件,调用格式为:matPutVariable(mfp,name,mp)mfp是指向MAT文件的指针,name指定将数据写入文件中所使用的变量名,mp是mxArray类型指针,指向内存中待写入文件的数据块。12.2.2 MAT文件12.2 文件操作2.MAT2.MAT文件的基本操作文件的基本操作(2)读写MAT文件 从MAT文件读取数据的函数matGetVariable函数用于从MAT文件读取指定变量,调用格式为:matGetVariable(mfp,name)mfp是指向MAT文件的指针,name是mxArray类型变量。如果读操作成功,返回一个mxArray类型值,不成功,则返回NULL。1
22、2.2.2 MAT文件12.2 文件操作2.MAT2.MAT文件的基本操作文件的基本操作(2)读写MAT文件 获取MAT文件变量列表的函数matGetDir函数用于获取MAT文件的变量列表,调用格式为:matGetDir(mfp,n)mfp是指向MAT文件的指针,n是整型指针,用于存储MAT文件中所包含的mxArrary类型变量的个数。操作成功,返回一个字符数组,其每个元素存储MAT文件中的一个mxArray变量名;12.2.2 MAT文件12.2 文件操作2.MAT2.MAT文件的基本操作文件的基本操作(3)关闭MAT文件matClose函数关闭MAT文件,释放其所占用的内存资源。调用格式为
23、:matClose(mfp);mfp是指向MAT文件的指针12.2.2 MAT文件12.2 文件操作3.mx3.mx函数函数在C+程序中,使用mxArray类型的数据需要调用mx函数进行处理。12.2.2 MAT文件C+程序中常用mx函数12.2 文件操作4.4.读写读写MATMAT文件的方法文件的方法【例12.7】编写C+程序,创建一个MAT文件mattest.mat,并写入三种类型的数据。12.2.2 MAT文件12.2 文件操作5.5.编译编译读写读写MATMAT文件的文件的C+C+程序程序(1)使用MATLAB编译器编译在MATLAB桌面的命令行窗口执行以下命令:mex-v-clien
24、t engine MatDemo.cpp这时,在MATLAB当前文件夹下生成了应用程序文件MatDemo.exe。(2)用其他编译器编译如果用其他编译器编译读写MAT文件的C+源程序,需要先对含该源程序的项目的属性进行设置。12.2.2 MAT文件12.2 文件操作6.6.运行应用程序运行应用程序(1)设置运行环境。(2)运行应用程序(3)加载MAT文件12.2.2 MAT文件12.3 MATLAB编译器MCRMCR(MATLAB Compiler Runtime)MATLAB Compiler Runtime)是是MATLABMATLAB提供的编译工具提供的编译工具。【例12.8】设工作文件
25、夹下有alone.m文件,内容如下:n=3;theta=0:90;x=n*cos(theta)+cos(n*theta);y=n*sin(theta)-sin(n*theta);plot(x,y)用MATLAB编译器将alone.m文件生成一个独立的应用程序。12.3.1 生成独立应用程序12.3 MATLAB编译器(1)建立工程。从“APP”选项卡的“APP”功能组中选“Application Compiler”,或在MATLAB命令面板中输入以下命令。applicationCompiler12.3.1 生成独立应用程序12.3 MATLAB编译器(2)打包工程。单击编译器工具栏右端的“Pa
26、ckage”按钮打包成功后,在当前文件夹下会创建项目文件夹,项目文件夹下有以下内容:文件夹for_redistribution:存储安装程序。文件夹for_redistribution_files_only:存储发布成功的应用程序、图标、说明文档等文件。文件夹for_testing:存储用于测试的应用程序文件。文件PackagingLog.html:记录编译过程的相关信息。12.3.1 生成独立应用程序12.3 MATLAB编译器(3)安装应用。运行工程文件夹的子文件夹for_redistribution下的安装程序(MyAppInstaller_mcr.exe或MyAppInstaller_
27、web.exe)安装应用。(4)运行应用程序。12.3.1 生成独立应用程序12.3 MATLAB编译器1 1生成生成.NET.NET组件组件MATLAB Builder NE用于将 MATLAB程序生成.NET 或COM组件,随后可以在.NET程序中调用。【例12.9】在当前文件夹下有函数文件mymagic.m,文件的内容如下:function y=mymagic(x)y=magic(x);将mymagic.m编译生成.NET组件,并发布到.NET应用中。12.3.2 生成组件和共享库12.3 MATLAB编译器1 1生成生成.NET.NET组件组件(1)用MATLAB Builder NE
28、生成.NET组件 创建MATLAB Builder NE类的.NET Assembly工程。修改工程参数。打包工程。安装应用。12.3.2 生成组件和共享库12.3 MATLAB编译器1 1生成生成.NET.NET组件组件(2)在.NET应用中使用.NET组件 建立Visual Studio项目。添加对组件mymagic.dll的引用。添加对MATLAB系统库文件MWArray.dll的引用。向工程中添加一个窗体,在窗体中放置一个文本框TextBox1、一个标签Label1和一个命令按钮Button1。编辑代码12.3.2 生成组件和共享库12.3 MATLAB编译器2 2生成生成ExcelE
29、xcel插件插件【例12.10】将例12.9的函数文件mymagic.m生成Excel插件,并在Excel中使用。(1)编译预处理。(2)建立一个MATLAB Library Compiler类的Excel Add-in工程。在TYPE列表里选中“Excel Add-in”项。(3)打包工程。(4)安装应用,注册组件。(5)在Excel加载组件。12.3.2 生成组件和共享库12.4 MATLAB与其他语言程序的应用接口MEX是MATLAB中用于调用其它语言编写的程序的接口。1 1MEXMEX函数函数MEX库函数用于MEX程序与MATLAB环境交换数据和从MATLAB工作空间获取相应信息。12
30、.4.1 MEX文件12.4 MATLAB与其他语言程序的应用接口2 2MEXMEX文件源程序的建立文件源程序的建立(1)入口子程序定义被MATLAB调用的外部子程序的入口地址、MATLAB系统和子程序传递的参数等。入口子程序的定义格式如下:void mexFunction(int nlhs,mxArray*plhs,int nrhs,const mxArray*prhs)nlhs定义输出结果的个数,plhs指向用于返回输出结果的变量,nrhs定义输入参数的个数,prhs指向存储输入参数的变量。prhs 和 plhs 都是指向mxArray 对象的指针。12.4.1 MEX文件12.4 MAT
31、LAB与其他语言程序的应用接口2 2MEXMEX文件源程序的建立文件源程序的建立(1)入口子程序(2)计算子程序(Computational Routine)由入口子程序调用。计算子程序的定义格式和其他C/C+子程序的定义格式相同。头文件mex.h中包含了所有的MEX函数声明,因此在文件首加入宏命令:#include mex.h12.4.1 MEX文件12.4 MATLAB与其他语言程序的应用接口【例12.1112.11】用C+编写求两个数的最小公倍数的MEX文件源程序,并编译生成MEX文件。调用该MEX文件,求两个整数的最小公倍数。12.4 MATLAB与其他语言程序的应用接口3 3MEXM
32、EX文件源程序的编译文件源程序的编译编译mex文件源程序有两种方法:利用其他编译工具,如Microsoft Visual Studio;利用MATLAB提供的编译器。例如,编译例12.11的MEX源程序,在命令行窗口输入 mex cmex.cpp编译成功,将在当前文件夹下生成与源程序同名的MEX文件cmex.mexw64。12.4.1 MEX文件12.4 MATLAB与其他语言程序的应用接口3 3MEXMEX文件源程序的编译文件源程序的编译调用MEX文件的方法和调用M函数的方法相同。例如,在MATLAB命令行窗口输入以下命令测试上述MEX文件:z=cmex(6,9)z=1812.4.1 MEX
33、文件12.4 MATLAB与其他语言程序的应用接口在其他语言编写的程序中利用MATLAB引擎来调用MATLAB函数。1 1MATLABMATLAB引擎引擎函数函数头文件engine.h包含了所有C/C+引擎函数的定义,因此在文件首须加入宏命令:#include engine.h在C+程序中,通过指向MATLAB引擎对象的指针操作MATLAB引擎对象。定义指向MATLAB引擎对象指针的格式为:engine*mepEngine是MATLAB引擎类型,mep为指针变量。12.4.2 MATLAB引擎12.4 MATLAB与其他语言程序的应用接口1 1MATLABMATLAB引擎引擎函数函数12.4.
34、2 MATLAB引擎在C/C+程序中使用MATLAB 引擎,还要用到mx-函数,以实现对mxArray对象的操作。12.4 MATLAB与其他语言程序的应用接口2 2MATLABMATLAB引擎的使用引擎的使用(1)建立mxArray类型的变量mxCreateDoubleMatrix函数建立mxArray类型的变量,原型如下:mxArray*mxCreateDoubleMatrix(mwSize m,mwSize n,mxComplexity ComplexFlag);m、n指定矩阵的大小,ComplexFlag指定成员值是否为复数,当ComplexFlag为mxREAL 时,成员值是实数。(
35、2)给mxArray类型的变量赋值调用memcpy函数将自定义的数据复制到mxArray类型的变量中,原型如下:void*memcpy(void*destinationPtr,const void*sourcePtr,size_t num);destinationPtr、sourcePtr分别为指向目标矩阵、源矩阵的指针,num指定复制的数据个数。12.4.2 MATLAB引擎12.4 MATLAB与其他语言程序的应用接口2 2MATLABMATLAB引擎的使用引擎的使用(1)建立mxArray类型的变量(2)给mxArray类型的变量赋值(3)将变量放入MATLAB引擎所启动的工作区中调用以
36、engPut开头的函数将变量放入MATLAB引擎所启动的工作区。调用engEvalString函数来实现执行MATLAB的命令。12.4.2 MATLAB引擎12.4 MATLAB与其他语言程序的应用接口【例12.12】用C+编写一个程序,该程序按极坐标方程=a+b计算数据点坐标,然后调用MATLAB的绘图函数绘制出曲线。12.4.2 MATLAB引擎12.4 MATLAB与其他语言程序的应用接口3 3编译编译MATLABMATLAB计算引擎程序计算引擎程序使用mex命令对源程序文件进行编译,生成可执行程序文件。例如,编译例12.12的计算引擎程序,在命令行窗口输入以下命令:mex-client engine cppeng.cpp编译成功,在当前文件夹下生成一个与源程序文件同名的可执行文件cppeng.exe。在MATLAB中测试该程序:!cppeng12.4.2 MATLAB引擎
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。