




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 M文件程序设计根底第1节 M文件 MATLAB有两种工作模式:一种是在命令中直接输入简单的命令,适于处理计算量不大的问题;另一种是M文件的编程工作方式,可以进行大量的重复性的计算和输入。MATLAB的命令文件(script)和函数文件(function),是一个简单的ASCII 码标准文本文件,扩展名为“.m。该文本文件可以用任何文字处理软件对进编辑,也可以用“type filename.m形式在命令工作空间翻开MATLAB是解释性编程语言,逐句解释运行程序MATLAB的各种工具箱都是用M文件组成,除内嵌(built-in)M文件以外,用户可以对其进行修改和扩充,进行二次开发M文件编辑
2、器是MATLAB自带的,是一个Windows的标准界面,主要有file,edit,view,debug,breakpoint和text等菜单栏,上机时参考P17第一章第4节M文件编辑器有两种形式,一种是命令文件Script-file,另一种是函数文件Function-file命令文件函数文件形式不需要说明第一行用function说明参数没有输出和返回参数可以接受和返回参数数据变量为全局变量,既为工作空间变量变量为函数内部变量,也可以处理全局变量应用是调用一系列命令和函数的集合,便于修改反复调用,可改变参数,可用于扩充函数库运行形式直接调用(文件名)文件名且带实参调用内部函数不能可以编写和调用内
3、部函数一、命令文件 其实就是一段命令的集合产生的变量都是全局变量,可以用clear去除运行此类文件前,须指定文件的位置cd “盘符:路径“current directory快捷键选择当前工作目录步骤翻开已有文件:fileopen文件名.m可省略新建:filenew进入编辑器:编辑m文件保存:filesave文件名.m可省略运行:debugrun 或 命令行键入M文件名 【例6-1】 建立命令文件,绘制花瓣图。theta = -pi:0.01:pi;rho(1,:) = 2*sin(5*theta).2;rho(2,:) = cos(10*theta).3;rho(3,:) = sin(thet
4、a).2;rho(4,:) = 5*cos(3.5*theta).3;for k =1:4 % 循环控制 polar(theta ,rho(k,:) % 绘制极坐标图 pause; %暂停end二、函数文件 函数文件第 1 行为函数定义行 function 返回参数表=函数名(输入参数列表)MATLAB以关键词function开头,把M文件定义为一个函数文件,指出函数名、函数文件名、输入参数和返回参数。函数名最好要和函数文件名一致,通过函数文件名调用函数例:subfun.msubfun(-7:4)subfun(-1:4) function y = subfun( t ) if sum(t)0
5、y=abc(t); else y=cba(t);Endfunction y=abc(t); y=2*t;function y=cba(t) y=2*t;函数文件内部定义的函数,通过函数名调用函数文件subfun.m函数文件的一般格式函数定义行 function 返回参数表=函数名(输入参数列表)函数名一般要与函数文件名相同如果有多个输入参数,用逗号,分隔参数如果有多个返回参数,那么用方括号 括起来,且参数之间以逗号,分隔形如:function xx,yy,zz=meshgrid(x,y,z) H1行:可缺省,以%开头,主要包括大写体的函数名,运用关键词简要的描述函数功能在线函数帮助内容 可缺省
6、,以%开头,祥细的内容说明,可以用help 函数名,查看。如:P189 help average函数体,函数的核心局部【例6-2】 建立函数文件,计算矢量中元素的平均值。function y = average(x)% AVERAGE Mean of vector elements.% AVERAGE(X), where X is a vector, is the mean of vector.% Non-vector input results in an error.m,n = size(x);if (m = 1) | (n = 1) | (m = 1 & n = 1) error(Inp
7、ut must be a vector)endy = sum(x)/length(x); % Actual computation命令窗口调用:Z=1:99average(Z)函数参数的传递 利用函数的输入、输出参数传递这一点,可以在较大计算中灵活的处理数据。只要修改函数的传递参数,而不影响程序整体。 同其他高级语言一样,函数可以调用自身,也就是递归。例如求阶乘function y=ff(n) if n= =1 y=1; return; else y=n*ff(n-1); return; end; b=ff(9);c=ff(3)whos %看不到ff函数内部的变量设置出口条 件递归函数文件是一
8、个“黑箱,外界只能看到输入和输出变量。函数内部的变量只在内部起作用是局部变量,假设要定为全局变量,还需用global 声明Function bodyinout命令文件内部不能定义函数命令文件的全局变量执行后仍在工作空间中,而函数文件的局部变量在函数运行后即被自动去除它们也是以“.m为扩展名三、局部变量和全局变量局部变量:函数体内部的变量,不能在函数体以外使用全局变量:在MATLAB的工作空间和所有的函数体内都能使用的变量函数文件对全局变量赋值之说明:global 尽量使用大写 尽可能防止使用全局变量,用函数的参数来传递数值,可提高程序的灵活性 四、永久变量:系统预定义变量Predefined
9、variableclear命令不能去除Who或Whos看不到 用户可以对其赋值,但clear后又恢复到初始系统设定状态 例补1:无穷大infy=1/0 %无穷大 inf 1/y % 0常用永久变量列表 永久变量定 义ans计算结果缺少变量名eps容差:定义为1.0到最近浮点数的距离Inf或inf无穷大,定义为1/0pi圆周率i或j虚数单位i,jNan或nan非数(not a number),如0/0nargin函数输入总量数目nargout函数输出总量数目realmax最大的浮点数realmin最小的浮点数五、根本表达式(手写式)常用格式表达式 变量=表达式 书写规那么表达式由变量、运算符、函
10、数名组成按常规的优先级别从左至右执行优先级别:指数运算最高,乘除运算次之,加减运算级别最低括号内的表达式优先运算表达式末尾加“;,系统将不显示计算结果,提高运算速度,否那么将逐条显示语句运算结果MATLAB允许一次返回多个结果等号“=左边用 括起来的变量列表,变量之间用逗号分隔 例补2:x,y,z=peaks %返回三个量plot3(x,y,z)第2节 M文件调试的主要功能 在运行MATLAB程序时,发现错误,系统会提示错误的行位置及错误原因。对此,用户可以“对症下药。一、 debug菜单 step 单步执行当前行step in 深入函数step out 跳出函数(例test_debug.m)
11、save & run 保存并运行 或 F5Go until cursor 直接运行到光标所在的位置exit debug mode 退出调试 二、breakpoint 断点设置 set/clear breakpoint 设置/去除断点clear all breakpoint 去除所有断点stop if warning 如有警告信息停止程序运行stop if NaN or Inf 如现非数或无穷大就停止程序运行第3节 MATLAB 数据类型 1、数据结构 MATLAB是一种面向数组Array的编程语言,其他数据类型的最大特点是每一种类型都以数组为根底,从数组中派生出来的。MATLAB有6种根本的数
12、据类型:char(字符数组);numeric(数值数组);struct(结构) ;java类cell(单元数组) ;function handle (函数句柄 );数组MATLAB数据结构图字符型 数值型 单元数组 结构数组char numeric cell struct双精度 存储型double storage(如:int8,unit8等)稀疏数据 sparce存储型是一个虚拟数据类型,包括:int8(8位整型),uint8(8无符号整型),int16(16位整型),uint16(16无符号整型),int32(32位整型),uint32(32无符号整型)最常用的数据类型是双精度类型和字符型。
13、所有 的MATLAB计算都把数据当作双精度型处理 其他数据类型只在一些特殊条件下使用8位整型一般用于储存图像数据存储型数组一般只用于内存的有效储存,可对这些类型数组进行操作,但不能进行任何数据运算。如果要运算那么必须用double函数把它转换为双精度类型2、字符串数组 所有字符串都用单引号括起来常用字符串处理函数建立字符串数组 例补3a=This is a booka(1) ; % Ta(4) % s字符串中每一个字符都是变量的一个元素字符串中的字符以ASCII码形式储存并区分大小写,用abs函数可以得到字符的ASCII码直接赋值 中文字符串数组,每个“汉字符为一个数组单元 例补4A=这是一本
14、书1234567891011121314151617Thisisabook”本”矩阵长度函数 length(X):矩阵行向量长度 size(X):矩阵大小带引号字符的数组 例补5 B=This is a book本例补6 length(B) %17 size(B) %1 17有效字符串连接 a)直接连接例补7ab=A,Bla=length(A) %字符串长度函数lb=length(B)lab=length(ab)b) strcat函数连接 concatenate例补8cd=strcat(A,B)lcd=length(cd)a=this is; b=a, strcmp(a,b) %字符串比较函数
15、c=a; strcmp(a,c)strcmp(A,B) 字符串数组比较 逐个比较两个字符串数组的元素,都相等那么返回1,否同返回0 见上例求ASCII码:将字符串转换为ASCII码值 abs(X):X为字符串数另外,abs函数还可求复数矩阵的模,实数的绝对值 多行字符串数组直接创立 AB=S1;S2要求:S1和S2长度相同,以保证各行长度相等例补9length(a)length(A)ab=a;A, %补2个空格ab(1,1)ab(2,1)ab=a;A %出现错误因长度不同,不能组合注意:汉字符在内存中占2个字节,英文字符占1个字节;而在字符串数组中,每一个字符占一个单位空间,不管它是汉字符还是
16、英文字符。字符型转换函数用字符串函数建立字符串数组 s=char(t1,t2,t3,)s=str2mat(t1,t2,t3,) s=strvcat(t1,t2,t3,)t1,t2,t3,是字符串,可以是字符串变量,也可以直接用单引号括起来的字符串常量。三个函数都是生成字符串数组多行,不用补加空格。例补10 s1=char(a,A,B) s2=str2mat(a,A,B) s3=strvcat(a,A,B)3、单元数组 单元数组Cell Array是一种比较特殊的MATLAB数组,有的资料称之为元胞数组。它的根本成分为单元,每一个单元中又可以包含其他类型的MATALB数组。各单元在数组中是平等的
17、,彼此以下标区分。单元可以存放任何类型、大小的数组,且单元数组内的各单元内容可以彼此不同。 单元数组的维数不受限制,其编址方法同样可以是单下标编址和全下标编址。单元数组中的“单元与“单元的内容是两个不同的概念。它们分别用圆括号和花括号表示。单元数组的建立利用赋值语句建立单元数组用小括号括起单元下标,赋值等号右边用花括号括起单元内容 A(2,3)指A单元数组中第二行第三列单元元素A2,3代表A单元数组中第二行第三列的单元元素中所存取的内容。例补11clearA(1,1)=matlab %字符串A(1,2)=6.0 %数值A(2,1)=矩阵 %中文字符串A(2,2)=2 3 4;23 1 4;5
18、4 8 %矩阵A %显示A的单元A(2,2) %A(2,2)单元元素A2,2 %A(2,2)单元元素内容用花括号括起单元下标,等号右边直接赋值 例补12clear A1,1=matlab %字符串A1,2=6.0 %数值A2,1=矩阵 %中文字符串A2,2=2 3 4;23 1 4;5 4 8 %矩阵 利用单元数组法建立单元数组用花括号直接赋值,单元与单元之间用逗号、空格或分号(分行)隔开,一次完成 A=matlab, 6.0; 矩阵, 2 3 4;23 1 4;5 4 8利用函数cell建立空的单元数组 cell用来预分配指定大小的单元数组。单元数组的访问和显示 利用花括号访问单元内容(只能
19、访问一个单位),返回的是元素内容的数值类型 如:A1,1c=cell(n) 建立nn的单元数组,单元是空矩阵c=cell(m,n) 或c=cell(m,n) 建立mn的单元数组,单元是空矩阵c=cell(size(A) 建立与A同维的单元数组,各单元是空矩阵利用圆括号访问单元子集,返回的是一个单元数组(cell) 如:A(:,1)常用单元函数celldispA 显示单元数组全部或局部内容 cellplot(C,legend) 用图形显示单元数组内容,其中legend用于实现色彩图例,大白方格表示单元,用方格表示所存数组元素,色彩表示数据属性例补13celldisp(A)celldisp(A(:
20、,2)cellplot(A,legend)例:用单元数组建立下表档案姓名性别年龄政治面貌英语政治高数张三男19团员857595李四女18团员908096王二男18团员808597那么dangan1,1=张三; dangan1,2=男; dangan1,3=19; dangan1,4=团员; dangan1,5=85 75 95;dangan2,1=李四; dangan2,2=女; dangan2,3=18; dangan2,4=团员; dangan2,5=90 80 96;dangan3,1=王二; dangan3,2=男; dangan3,3=18;dangan3,4=团员; dangan3
21、,5=80 85 97;4、结构数组 结构数组(Structure Array)与单元数组一样,能在一个数组存放各类数组,其根本成分是结构(Structure)。数组中的每一个结构相等,它们以下标区分。直接建立结构数组 格式:结构名.域名.子域名.=.结构以“域为单位,数据不能直接存在结构上,而是放在“域中,数据可以是任何类型、大小的数组,而且不同结构的同名域中存放的内容可以不同。 结构名、域名和子域名之间用点号“.分隔,赋值完毕,结构数组也就形成,只有访问到子域的最底层,才能见到数据。例补14:建立如下结构的结构数组bridge name position heigth group valu
22、e =XX 大桥bridge.position=顶板 bridge.position.group=2组 %对bridge.position再赋值bridge.position.value=28.4 29.4 30.1;26.8 29 28.8bridge.heigth=56用struct函数建立 S=struct(field1,values1,field2,values2,)指定的域名和各域的数据 例补15s=struct(name,XX大桥,position,2组, 28.4 29.4 30.1;26.8 29 28.8,heigth,56)s.positi
23、ons.height5、数据文件的存取 .mat文件:load 和 savesave 文件名 :保存工作空间所有变量save 文件名 变量名 变量名 变量名保存指定变量,变量名之间以空格分隔load :导入指定文件中的所有变量S=load(文件名) :将文件中的变量传递给结构数据S.txt, .dat等ASCII文件: load 和 save.bmp, .jpg, .tif等图像文件:imread和imwrite.wav声音文件:wavread和 wavwrite .avi音影文件:aviread和avifile6、数据输入向导试验第4节 MATLAB程序设计一、运算符和操作符 MATLAB的
24、运算及操作符与Pascal、C相差不多,主要区别在于对矩阵的运算操作上。以下主要介绍与已往学习中不同的以及前面章节中未提到过的运算和操作符。运算符 :左除/ :右除操作符. :上一级目录 :对于很长的语句,一行写不下,可在该行末尾加3个或更多的点,表示此行未完,下一行继续二、关系运算与逻辑运算 MATLAB对此类运算符有如下规定所有的关系表达式或逻辑表达中,任何非0数都是“逻辑真,只有0才是“逻辑假关系表达式或逻辑表达式的计算结果是一个由0和1组成的“逻辑数组(Logical Array),数组中1表示真,0表示假逻辑数组是一种特殊的数值数组,与“数值数组有关的操作和函数对它也适用,具有自身的
25、特殊用途优先级别: 算术运算关系运算逻辑运算三、程序的流程控制1、顺序结构 同其他高级语言 2、循环结构 为提高效率,MATALB程序中应防止使用循环结构,尽量找到一个等效的数组方法或现成的函数、命令代替 for-end格式:for x=array commands endarray是数组,可以是数值型数组:整数、小数,负数;可以是字符串数组;也可以是单元数组; 循环变量以数组的列为单位循环次数等于数组的列数,且循环次数在执行过程中不变可以使用循环嵌套,注意:for-end对应【例6-3】简单的for循环例如。n=10;for i=1:n x(i)=(i+1).2;End在循环指令前,尽量对数
26、组进行预定义(用size帮助),以提高速度【例6-4】for循环的嵌套。m=3;n=4;for i=1:m for j=1:n a(i,j)=1/(i+j-1); endend【例6-5】运用非1步长for循环,产生020以内的偶数for i=0:2:20 a(i/2+1)=i;endwhile-end 格式:while expression commands expression end这是一个“当型循环,当表达式expression为真非0时,才执行循环体内的语句commands。如果expression为一数组时,那么只有当该数组所有元素均为真时,才会执行循环体。【例6-6】求解使n!到
27、达100位数的第一个n是多少?n=1;while prod(1:n)=0.90) & (grade=60) % 判断出席率和成绩 pass = 1; % 满足条件为通过else fail = 1; % 否那么为不通过end;格式3:if expression1 statements1 elseif expression2 statements2 else statementsn end【例6-8】用色彩区分数据点的范围。n=100;x=1:n;y=randn(1,n); % 建立100个元素的随机行矢量hold on for i=1:n if y(i)=-1 & y(i)=1 plot(x(i
28、),y(i),xr) % 大于1的点用红色的x标出 endendhold off4、分支语句switch-case-end 格式:switch switch_expr case case-expr1 statements1 case case-expr2, case-expr3 statements2 otherwise statementsn end表达式的结果应为标量或字符串检测值可以是任何类型2个以上的元素,用花括号“switch-case-end switch_expr可以是任何类型表达式,表达式的结果应为标量或字符串case_expr检测值可以是任何类型,如果是2个或2个以上的元素,
29、那么应用花括号“括起来如果switch_expr存在于检测值case_expr中,那么执行与之最先匹配的case_expr对应的语句,然后跳出switch结构检测值case_expr中没有与switch_expr匹配的值,如有otherwise语句那么先执行其后的语句,然后退出switch结构;如无otherwise语句那么直接退出switch结构【例6-9】使用switch-case-end语句,检查输入数据的值。input_num=input(input_num=)switch input_num case -1 disp(negative one); % 当input_num=-1时显示
30、 case 0 disp(zero); % 当input_num=0时显示 case 1 disp(positive one); % 当input_num=1时显示 otherwise disp(other value); % 当input_num等于其他值时显示end5、检测语句 try-catch 检测错误并改变流程。格式: try statements1catch statements2endstatements1正确执行后,跳出结构statements1错误执行catch的statements2lasterr 显示系统最后错误信息【例6-10】使用try-catch语句,判断错误语句。
31、clearn=4;a=magic(3); % 设置33矩阵atry a_n=a(n,:), % 取a的第n行元素catch a_end=a(end,:), % 如果取a的第n行出错,那么改取a的最后一行end lasterr % 显示出错原因6、其他流控制语句 continue 跳过循环体中剩余的语句,继续执行下一次循环【例6-11】使用continue语句,显示文件行数。fid = fopen(magic.m,r); % 翻开magic.m文件count = 0; % 计数器置零while feof(fid) % 循环的判断条件:是否文件末尾 line = fgetl(fid); % 从文件
32、中读当前行if isempty(line) | strncmp(line,%,1) % 判断是否为空行或注释行 continue % 如果是空行或注释行继续下一次循环 end count = count + 1;% 如果不是空行或注释行计数器加1enddisp(sprintf(%d lines,count); % 显示剔除空行和注释语句后的行数break 终止所在for 和while循环体的执行【例6-12】break语句的用法。fid=fopen(fft.m,r); % 翻开fft.m文件s=; % 创立空的字符数组while feof(fid) % while循环的判断条件:是否文件末尾 line=fgetl(fid); % 从文件中读行 if isempty(line) % 如果是空行 break % 退出循环 end s=strvcat(s,line); % 如果不是空行,将该行写入字符数组enddisp(s) % 显示字符数组结果return 终止当前的命令序列,并返回到调用的函数或键盘几个终止程序语句的区别break 终止所在最内层的循环function d=det(A)if isempty(A) %空矩阵那么返回 returnelse .endreturn 终止当前所在函数的运行,控制返回到上一级函数或系统error 终止整个程序,控制返回到键盘exit 终
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年宣传教育全年工作总结模版
- 佣金返还合同范例
- 企业文化在办公空间人性化设计中的体现
- 2025年新《党政领导干部选拔任用工作条例》学习讨论发言稿模版
- 机器人焊接 14 项目七任务7.2教学设计
- 医疗大数据挑战与机遇并存的价值挖掘
- 仓储协议合同范例简短范例
- 幼儿园教师年度考核个人工作总结模版
- 关于建筑师负责制的工作总结模版
- 医疗物资全链条管理的实践与思考
- DBJ-T13-483-2025 预拌流态固化土技术标准
- 2025年全国中学生汉字听写大会比赛题库及解析(共八套)
- 防汛安全培训课件
- 关于临期商品的处理管理办法
- 新能源全面入市是构建新型电力系统的重要支撑-136号文政策解读
- 2025消防业务理论考试题库及参考答案
- 机关财务报销制度和流程
- DB12-T1196-2023公路养护工程质量检验评定标准
- 水幕电影制作合同
- 交通政策对经济增长的效应分析-深度研究
- 儿科感染性疾病
评论
0/150
提交评论