4.1 M文件
所谓M文件就是将处理问题的各种命令融合到一个文件中,该文件以.m为扩展名,然后由MATLAB系统进行编译,得出相应的运行结果,具有相当大的可开发性和扩展性。M文件有脚本文件的函数文件两种。脚本文件不需要输入参数也不输出参数,按照文件中指定的顺序执行命令序列。而函数文件则接受其他数据作为输入参数,并且可以返回数据
4.1.1 M文件编辑器
-
函数定义行
用于定义函数名称,定义输入输出变量的数量、顺序。脚本式M文件没有此行
完整函数定义为 function[out1,out2,out3…]=funName(in1,in2,in3…)
其中输入变量用圆括号,变量间用英文逗号分隔。输出变量用方括号,无输出可用空括号或无括号和等号
无输出的函数定义行可为 function funName (in1,in2,in3) -
H1行
紧跟着函数定义行,因为它是Help文件的第一行,所以叫做H1行,用%开始
MATLAB可以通过命令把M文件上的帮助信息显示在命令窗口。因此建议写M文件时建立帮助文本
H1行是函数功能的概括性描述,在命令窗口提示符下输入命令可以显示H1行文本
help filename或者look for filename -
Help文本
这是为帮助建立的文本,可以是连续多行的注释文本。只能在命令窗口观看
帮助文本遇到之后的第一个非注释行结束,函数中的其他注释行不被显示 -
注释
以%开始的注释行可以出现在函数的任何地方,也可以出现在一行语句的右边
若注释行很多,可以使用注释块操作符 -
函数体
函数体是函数和脚本中计算和处理数据的主体
4.2 流程控制
4.2.1 人机交互命令
-
输入提示命令 input
input命令用于提示用户从键盘输入数据、字符串或表达式,并接受输入值
user_entry = input(‘prompt’):显示prompt,等待用户输入,输入的值赋给变量user_entry
user_entry = input(‘prompt’,‘s’):参数‘s’表示返回的字符串作为文本变量,而不是作为变量名或数值
若没有输入任何字符,而只是按回车键,input将会返回一个空矩阵。
在提示信息的文本字符串中可能包含\n字符,表示换行输出 -
请求键盘输入命令 keyboard
请求键盘输入命令keyboard如被放置在M文件中,将停止文件的继续执行,并将控制权交给键盘
可通过在提示符前显示K来表征这种特殊状态。
为了中止keyboard模式,可以键入命令return,然后按回车键 -
pause命令
pause命令用于暂时中止程序的运行。当程序运行到此命令时,程序暂时中止,然后等待用户按任意键继续执行。该命令在程序的调试过程和用户需要查询中间结果时十分有用。
pause:导致M文件停止,等待用户按任意键继续运行
pause(n):再继续执行前中止执行程序n秒,n可以是任意实数。
pause on:将允许后续的pause命令终止程序的运行
pause off:将保证后续的任何pause或pause(n)语句都不中止程序的运行
pause命令常用于在循环内画图程序之后,这样可以通过短暂的暂停即时的观察所绘制的图像 -
echo语句
一般情况下,M文件执行时,在命令窗口看不到文件中的命令。但在某些情况下 ,需要查看文件中命令的执行情况,就要将M文件中所有命令在执行过程中显示出来,此时可以使用echo命令。
脚本文件:echo on 显示以后所有执行的命令 echo off 不显示以后所有执行的命令
函数文件:echo fcnname on:使fcnname指定的M文件的执行命令显示出来
echo fcnname off:使fcnname指定的M文件的执行命令不显示出来
echo fcnname:在上述两种情况中切换
echo on all:其后所有的M文件的执行命令显示出来
echo off all:其后所有的M文件的执行命令不显示出来
echo通常在调试程序或者进行演示的过程中使用
4.3 函数的类型
MATLAB中的函数主要有两种创建方法:在命令行中定义、保存为M文件。在命令行中创建的函数为匿名函数。通过M文件创建的函数包括:主函数、子函数和嵌套函数
4.3.1 主函数
- 主函数在结构上和其他函数没有区别。主函数在M文件中排在最前面,与其M文件同名,是唯一可以在命令窗口或者其他函数中调用的函数。主函数通过M文件名来调用
4.3.2 子函数
- 一个M文件中可以写入多个函数定义式,排在第一个位置的是主函数,排在主函数后面进行定义的函数都叫子函数,子函数的排列无规定顺序。子函数只能被同一个文件上的主函数或其他子函数调用。子函数与主函数没有形式上区别,每个字函数有自己的函数定义行。
- 调用一个子函数时的查找顺序:从一个M文件中调用函数时,matlab首先查看被调用函数是否是本M文件上的子函数,是则调用它,不是则再寻找是否有同名的私有函数,如果还不是则从搜索路径中查找其他M文件。因为最先查找的是子函数所以在M文件中可以编写子函数来覆盖原有的其他同名函数文件。
- 子函数的帮助文本:可以像为主函数写帮助文本那样为子函数写帮助文本,但是显示子函数的帮助文本要把M文件名加在子函数名前面。如:help newstates>mean
4.3.3 私有函数
- 私有函数是另一种子函数,只有父M文件可以调用它,私有函数的存储要在当前目录下建一个子目录,子目录名字必须为private。存放于private文件夹内的函数即为私有函数,它的上层目录称为父目录,只有父目录中的M文件才可以调用私有函数
- 私有函数对于其父目录以外的目录中的M文件来说是不可见的
- 调用私有函数的M文件必须在private子目录的直接父目录内
- help private/myprivfun
- 私有函数只能被其父文件夹中的函数调用,所以用户可以开发自己的函数库,函数名称可以与系统标准M函数库名称相同,而不用担心在函数调用时发生冲突。因为matlab首先查找私有函数,然后再查找标准函数
4.3.4 嵌套函数
-
写嵌套函数
matlab允许在函数M文件的函数体中,定义一个或多个嵌套函数。像任何M文件函数一样,被嵌套的函数能包含任何构成M文件的成分
matlab函数文件一般不需要使用end语句来表征函数体已经结束,但是嵌套函数,无论是嵌套的还是被嵌套的,都需要以end语句结束。而且在一个M文件内,只定义了嵌套函数,其他非嵌套函数也要以end结尾 -
嵌套函数的调用
一个嵌套函数可以被下列函数调用:该嵌套函数的直接上一层函数、同一母函数下的同级嵌套函数,被任一低级别的函数调用 -
嵌套函数中变量的使用范围
通常在函数之间,局部变量是不能共享的。子函数不能与主函数或其他子函数共享变量,因为每个函数都有自己的workspace,用于存放自己的变量
嵌套函数也有自己的workspace,但因为他们是嵌套关系,所以有些情况下可以共享变量
4.3.5 重载函数
- 重载函数是已存在的函数另外的版。假设有一个函数是为某种特定的数据类型设计的,当要使用另外的数据类型时,就要重写此函数,使它能处理新的数据类型,但他的名字与原函数名相同。
4.4 函数的变量
4.4.1 变量类型
-
局部变量
每个函数都有自己的局部变量,这些变量存储在该函数独立的工作空间中,与其他函数的变量及主工作空间中的变量分开存。当函数调用结束时,这些变量随之删除,不保存在内存中,并且除了函数返回值,该函数不改变工作变空间中其他变量的值。
脚本文件没有独立的工作空间,当通过命令窗口调用脚本文件时,脚本文件分享主工作空间;当函数调用脚本文件时,脚本文件分享主调函数的工作空间。如果在脚本中改变了工作空间中变量的值,那么脚本文件调用结束后,该变量的值则会发生改变。
在函数中,变量默认为是局部变量 -
全局变量
全局变量可以定义该变量的在全部工作空间中有效。当在一个工作空间内改变该变量的值时,该变量在其他工作空间中的变量同时改变
任何一个函数如果需要使用全局变量,则必须首先声明 global var1 var2
如果一个M文件中包含的子函数需要访问全局变量,则需要在子函数中声明该变量;如果需要在命令行中访问该变量,则需要在命令行中声明该变量
在matlab中,变量名的定义区分大小写 -
永久变量
永久变量只能在函数文件内部定义,只有该变量从属的函数能够访问该变量,当函数运行结束时,该变量的值保留在内存中,因此当该函数再次被调用时,就可以再次利用这些变量
定义方法:persistent var1 var2
4.4.2 变量的传递
- 函数式M文件可以没有输入和输出变量
- 函数可以用比M文件中所规定的函数定义行的输入输出变量少的个数进行调用,但是不能多于规定的输入输出变量
- 一次调用中,所用到的输入和输出变量的个数可以通过分别调用函数nargin和nargout来确定
- 当一个函数被调用,输入变量并没有被复制到函数的工作空间中,但是它们的值在这个函数中是可读的。如果输入变量的任何值改变了,那么这个输入变量组就被复制到了函数的工作空间。
- 如果一个函数定义了一个或多个输出变量,但是用户在使用时不想输出所有结果,那么只要不把输出变量赋值给其他任何变量即可,或者在函数结束前用clear删除这些变量
- 函数可以通过在函数声明中将varargin作为最后的输入变量,接受可变的任意个数的输入变
4.5 函数句柄
4.5.1 函数句柄的创建
- 函数句柄并不是伴随着函数文件自动生成的文件“属性”,它必须通过专门的定义才能生成。为一个函数定义句柄的方法有以下两种:用@符号,利用转换函数str2func
- 创建函数句柄时,被创建句柄的函数文件必须在当前scope内。所谓当前scope包括当前目录、搜索路径、当前目录包含的private文件夹。此外,如果创建函数句柄的指令在一个函数文件中,那么该句柄包含的所有子函数也在scope内
- 加入被创建句柄的函数不在当前视野内,则所创建的函数句柄无效。对于这种无效创建,matlab既不会给出出错信息,也不会给出任何警告
- 函数句柄的创建调用语法:handle=@functionname
- 函数句柄是一个标准的matlab数据类型,用户可以在数组和结构体中使用
4.6 串演算函数
4.6.1 eval函数
- eval函数用来执行包含matlab表达式的字符串
- eval (expression):执行expressio作为matlab表达式指定的计算。expression应该是有效的matlab表达式,为字符串格式
- [a1,a2,a3]=eval(‘myfun(b1,b2,b3)’)执行函数myfun(b1,b2,b3),b1,b2,b3为myfun的输入变量,最终输出指定到a1,a2,a3
以上全部内容来自《matlab从入门到精通》
来源:CSDN
作者:Malcohol
链接:https://blog.csdn.net/Malcohol/article/details/104092525