目录

  • 函数
    • 定义
    • 分类
      • 嵌套函数
      • 匿名函数
      • 私有函数
      • 重载函数
  • 文件
    • 文件类型
      • .m文件
      • .fig文件
      • .mat文件
  • 调试
    • 节调试
    • 单步调试

函数

定义

       MATLAB中函数的定义如下所示:

function 输出参数 = 函数名(输入参数)函数体end% 输出参数格式% 1. 无(function 函数名(输入参数))% 1. 单个变量(function y = 函数名(输入参数))% 2. 数组形式(function [y1,y2,……] = 函数名(输入参数))% 输入参数格式% 1. 无(function 输出参数 = 函数名())% 1. 单个变量(function 输出参数 = 函数名(x))% 2. 数组形式(function 输出参数 = 函数名(x1,x2,……))

在某些地方定义函数可以不加end,但有些必须加,因此建议全部加上end。

以数组形式作为输入参数或函数参数实际上也是单个变量,只不过MATLAB的单个变量也是数组,因此不必担心输出参数是数组的话怎么赋值。

分类

       从被调用的角度来看,函数分为主函数和子函数,主函数是指在文件中排在最前,且与文件名同名的函数,(注意:两个条件实际上是固定的,函数文件中第一行必是与文件名同名的函数定义)在MATLAB中,只有主函数可以被其它文件调用。(也就是说调用一个函数文件中的函数,能且仅能调用主函数,而主函数名又与文件名相同

       从特殊性的角度来看,函数又可以分为四种:嵌套函数、匿名函数、私有函数和重载函数。

嵌套函数

       定义:在函数内部定义的函数。
       作用:感觉没什么作用。

嵌套函数可以操作父函数中的变量。(这里假设前者称为父函数)

匿名函数

       匿名函数的格式如下:

函数名 = @(变量1,变量2,……) 表达式

       类似于C语言中的#define 函数名(变量1,变量2,……) 表达式,即通过该函数名以及相应的变量,返回相应表达式的值。

命令行窗口不允许使用function创建函数,但允许匿名函数存在。(至少2020版是这样)


       匿名函数好像也被称为句柄函数,不过和函数句柄有点差别(注意句柄函数和函数句柄),函数句柄是指,将已存在的一个函数赋给另一个名称,以通过其它名称完成已存在函数的调用,类似#define 新名称 已存在的函数名称,MATLAB实现函数句柄的方法如下:

% 函数BubbleSortfunction y = BubbleSort(x)len = length(x);for m = 1 : len - 1for n = 1 : len - mif (x(n) > x(n + 1))[x(n), x(n + 1)] = deal(x(n+1), x(n));endenddisp(['Sort step', num2str(m), ': ', num2str(x)])endy=xend% 上面进行函数的定义fun = @BubbleSort% 此时,可以通过fun调用函数BubbleSortx=[6,3,7,8,5,1,2,4,9] %定义一个数组y = fun(x)% 等效于y = BubbleSort(x)

私有函数

       私有函数,即具有访问限制的函数,私有函数的函数文件位于private文件夹中,如下图所示的x.m函数即为私有函数,私有函数只能被父文件夹中的文件调用,以下图为例,x.m只能被y.m、Base.m文件调用,而哪怕被加入到文件路径中,也无法被z.m、nua.m等文件调用。

MATLAB函数访问可参考MATLAB文件路径。

重载函数

       重载函数,在MATLAB中是指函数名称相同,但参数类型或个数不同的函数。当然由于同一目录下不能有名称相同的同类型文件,因此重载函数一般是位于不同文件目录下。

       重载函数的定义和普通函数定义完全相同,被调用时,MATLAB会根据参数类型调用对应的函数。

文件

文件类型

       MATLAB中的文件按后缀可分为3种,即.m文件,.fig文件,.mat文件。

.m文件

       MATLAB中的.m文件类似于C语言中的.c文件,即用于存放MATLAB代码。虽然命令行同样可以执行,但无法有效保存,并且一不小心就会输出大量信息,打乱阵型。

       .m文件又可以分为脚本文件和函数文件,脚本文件中的代码可以按顺序执行(也就是一行行的代码),而函数文件中都是以关键字function开头,一般需要输入输出参数,因此哪怕点击运行也会进行报错。(如果是无输入参数的函数,哪怕有返回值,也可以运行成功

当然脚本文件和函数文件实际上没有区分,类似C语言,一直在main函数执行,调用其它.c文件中的函数,MATLAB也相同,一直在脚本文件中执行,只不过会调用函数文件中的函数。

       在MATLAB的当前文件夹窗口可以发现脚本文件和函数文件前面的图标不同,如下图所示,上面的BubbleSort.m为函数文件,下面的TestBubbleSort.m文件为脚本文件。


       下面是两个文件的具体内容,如果打开BubbleSort.m文件并点击运行,此时在命令行窗口会显示缺少参数,而打开TestBubbleSort.m文件并点击运行,此时正常进行排序后输出。

(运行时应处于相应路径下,此时当前文件夹窗口应能看见相应文件)

% BubbleSort.m文件(函数文件)function y = BubbleSort(x)len = length(x);for m = 1 : len - 1for n = 1 : len - mif (x(n) > x(n + 1))[x(n), x(n + 1)] = deal(x(n+1), x(n));endenddisp(['Sort step', num2str(m), ': ', num2str(x)])endy=xend% TestBubbleSort.m(脚本文件)clc; % 清除当前命令窗口的命令clear; % 清除内存x = randperm(9); % 将1到9这些数字随机打乱后赋值给xdisp([' Data before sort: x = ', num2str(x)]);disp('--------------------------------------');y = BubbleSort(x); % 调用冒泡排序函数对x进行排序,结果为ydisp('--------------------------------------');disp([' Data before sort: y = ', num2str(y)]);

函数文件中可以有多个函数,而脚本文件也可以编写函数,当然脚本文件中编写的函数不能位于文件最前面(即不能用function作为文件开头),当脚本文件调用a函数,而a函数在本脚本文件已定义时,优先使用本脚本文件中的a函数而不是相同路径下函数文件中的a函数。(决定.m文件作用的是代码,根据代码才有的所谓脚本和函数的分类)

点击运行按钮后,MATLAB运行哪个脚本文件由目前编辑器窗口打开的是哪个文件决定,如果打开的是脚本文件,则执行该脚本文件,如果是函数文件,则会根据是否存在输入参数,决定报错或运行。

.fig文件

       MATLAB中的.fig文件是用户界面窗口定义文件,也就是用于定义UI界面的文件,通过MATLAB打开该类型文件后会打开相应的UI界面,此时进行操作(比如通过鼠标点击其中的按钮)会调用相应的回调函数。

       .fig文件的创建可以在命令行窗口中输入guide,此时弹出以下弹窗,选择相应的模板并修改路径及文件名,再点击确定即可生成。

       此时MATLAB界面如下图所示,可以看到,当前文件夹窗口出现两个文件,try.fig文件即UI界面定义文件,try.m文件中则存放相应的回调函数,比如在在UI界面中放置一个按钮,那么点击后,需要执行的代码就会放在try.m文件中的相应回调函数中。

       关于.fig文件,对UI界面的使用会在其它文章撰写。(当你看到这句话时,表示我还没写完)

.mat文件

       .mat文件是MATLAB中用于保存数据的文件,通过save函数和load函数可完成.mat文件的操作,即将数据存储到.mat文件,以及从.mat文件中导出数据,函数的示例及解释如下表所示。

函数名示例解释
savesave 文件名
save 文件名 变量1名 变量2名
将工作区的变量保存至相应文件(生成对应的.mat文件)
将工作区的变量1和变量2保存至相应文件
loadload 文件名
load 文件名 变量1名 变量2名
将相应文件(.mat)文件中的变量加载到工作区
将相应文件(.mat)文件中的变量1和变量2加载到工作区

调试

       MATLAB进入调试的方法,似乎只能设置断点后点击运行,再开始相应调试按钮,如下图所示,单击编辑器窗口中序号旁边的“-”设置断点,点击运行后,工具栏中的编辑器标签页出现各个调试图标。

       各个图标的名称、快捷键、名称如下所示。

节调试

       节调试无相应图标,通过输入两个百分号“%%”将代码进行分节,此时Ctrl+Enter可单纯运行该节的内容。(从%%到另一个%%,鼠标单击相应节后,该节高亮显示,如下图的7~10行)

       节的添加与运行也可以在未调试时使用,移动鼠标到相应行,点击右键并选择“执行当前节(E)”或“插入节(I)”。通过节调试可单独对某一段代码进行调试。(当然可能要注意该节使用的变量,并且似乎无法使用私有函数)

单步调试

       通过断点进入调试后,即可进行单步调试,单步调试可通过表中各个按钮(或通过快捷键)逐行运行代码,查看效果。