Matlab学习笔记(四)——编程基础

旧街凉风 提交于 2020-01-31 10:21:49

4.1 M文件

所谓M文件就是将处理问题的各种命令融合到一个文件中,该文件以.m为扩展名,然后由MATLAB系统进行编译,得出相应的运行结果,具有相当大的可开发性和扩展性。M文件有脚本文件的函数文件两种。脚本文件不需要输入参数也不输出参数,按照文件中指定的顺序执行命令序列。而函数文件则接受其他数据作为输入参数,并且可以返回数据

4.1.1 M文件编辑器

  1. 函数定义行
    用于定义函数名称,定义输入输出变量的数量、顺序。脚本式M文件没有此行
    完整函数定义为 function[out1,out2,out3…]=funName(in1,in2,in3…)
    其中输入变量用圆括号,变量间用英文逗号分隔。输出变量用方括号,无输出可用空括号或无括号和等号
    无输出的函数定义行可为 function funName (in1,in2,in3)

  2. H1行
    紧跟着函数定义行,因为它是Help文件的第一行,所以叫做H1行,用%开始
    MATLAB可以通过命令把M文件上的帮助信息显示在命令窗口。因此建议写M文件时建立帮助文本
    H1行是函数功能的概括性描述,在命令窗口提示符下输入命令可以显示H1行文本
    help filename或者look for filename

  3. Help文本
    这是为帮助建立的文本,可以是连续多行的注释文本。只能在命令窗口观看
    帮助文本遇到之后的第一个非注释行结束,函数中的其他注释行不被显示

  4. 注释
    以%开始的注释行可以出现在函数的任何地方,也可以出现在一行语句的右边
    若注释行很多,可以使用注释块操作符

  5. 函数体
    函数体是函数和脚本中计算和处理数据的主体

4.2 流程控制

4.2.1 人机交互命令

  1. 输入提示命令 input
    input命令用于提示用户从键盘输入数据、字符串或表达式,并接受输入值
    user_entry = input(‘prompt’):显示prompt,等待用户输入,输入的值赋给变量user_entry
    user_entry = input(‘prompt’,‘s’):参数‘s’表示返回的字符串作为文本变量,而不是作为变量名或数值
    若没有输入任何字符,而只是按回车键,input将会返回一个空矩阵。
    在提示信息的文本字符串中可能包含\n字符,表示换行输出

  2. 请求键盘输入命令 keyboard
    请求键盘输入命令keyboard如被放置在M文件中,将停止文件的继续执行,并将控制权交给键盘
    可通过在提示符前显示K来表征这种特殊状态。
    为了中止keyboard模式,可以键入命令return,然后按回车键

  3. pause命令
    pause命令用于暂时中止程序的运行。当程序运行到此命令时,程序暂时中止,然后等待用户按任意键继续执行。该命令在程序的调试过程和用户需要查询中间结果时十分有用。
    pause:导致M文件停止,等待用户按任意键继续运行
    pause(n):再继续执行前中止执行程序n秒,n可以是任意实数。
    pause on:将允许后续的pause命令终止程序的运行
    pause off:将保证后续的任何pause或pause(n)语句都不中止程序的运行
    pause命令常用于在循环内画图程序之后,这样可以通过短暂的暂停即时的观察所绘制的图像

  4. 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 嵌套函数

  1. 写嵌套函数
    matlab允许在函数M文件的函数体中,定义一个或多个嵌套函数。像任何M文件函数一样,被嵌套的函数能包含任何构成M文件的成分
    matlab函数文件一般不需要使用end语句来表征函数体已经结束,但是嵌套函数,无论是嵌套的还是被嵌套的,都需要以end语句结束。而且在一个M文件内,只定义了嵌套函数,其他非嵌套函数也要以end结尾

  2. 嵌套函数的调用
    一个嵌套函数可以被下列函数调用:该嵌套函数的直接上一层函数、同一母函数下的同级嵌套函数,被任一低级别的函数调用

  3. 嵌套函数中变量的使用范围
    通常在函数之间,局部变量是不能共享的。子函数不能与主函数或其他子函数共享变量,因为每个函数都有自己的workspace,用于存放自己的变量
    嵌套函数也有自己的workspace,但因为他们是嵌套关系,所以有些情况下可以共享变量

4.3.5 重载函数

  • 重载函数是已存在的函数另外的版。假设有一个函数是为某种特定的数据类型设计的,当要使用另外的数据类型时,就要重写此函数,使它能处理新的数据类型,但他的名字与原函数名相同。

4.4 函数的变量

4.4.1 变量类型

  1. 局部变量
    每个函数都有自己的局部变量,这些变量存储在该函数独立的工作空间中,与其他函数的变量及主工作空间中的变量分开存。当函数调用结束时,这些变量随之删除,不保存在内存中,并且除了函数返回值,该函数不改变工作变空间中其他变量的值。
    脚本文件没有独立的工作空间,当通过命令窗口调用脚本文件时,脚本文件分享主工作空间;当函数调用脚本文件时,脚本文件分享主调函数的工作空间。如果在脚本中改变了工作空间中变量的值,那么脚本文件调用结束后,该变量的值则会发生改变。
    在函数中,变量默认为是局部变量

  2. 全局变量
    全局变量可以定义该变量的在全部工作空间中有效。当在一个工作空间内改变该变量的值时,该变量在其他工作空间中的变量同时改变
    任何一个函数如果需要使用全局变量,则必须首先声明 global var1 var2
    如果一个M文件中包含的子函数需要访问全局变量,则需要在子函数中声明该变量;如果需要在命令行中访问该变量,则需要在命令行中声明该变量
    在matlab中,变量名的定义区分大小写

  3. 永久变量
    永久变量只能在函数文件内部定义,只有该变量从属的函数能够访问该变量,当函数运行结束时,该变量的值保留在内存中,因此当该函数再次被调用时,就可以再次利用这些变量
    定义方法: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从入门到精通》

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!