



通过上述内容的学习,读者可以基本掌握程序编写的流程,可以独立写出简单的程序。相对而言,程序的写作相对容易,而写完后程序是否能保质保量地完成指定的设计任务才是关键。而对于普通用户来说,花在程序查错、调试上的时间可能远远大于程序的书写时间。因为MATLAB语言已为用户提供了大量的可以直接使用的函数,可以说我们在编写一段代码时,需要完全自己开发的算法部分已很少,仅是完成数据的导入、做些简单的判断,输入相应的函数完成相应的功能即可。但是,在这个过程中我们还是很容易出各种错误。出错后如何调试程序、使程序顺利完成相应的功能才是程序设计的关键,同时程序的调试需要不断地积累经验。在本节中笔者将结合多年使用MATLAB的心得体会,与读者探讨MATLAB常见的错误类型及其程序的调试方法。
一般MATLAB程序中常见的错误大致可以分为3类。
1.拼写错误
这类错误主要涉及函数名或者变量名拼写错误,MATLAB运行后会提示找不到变量或函数的错误信息;MATLAB中的一些函数需要设置固定的参数,其中参数的关键词如果拼写错误,就会提示找不到这个参数;另外一些MATLAB固定的关键字、流程控制语言,也会由于一时大意拼写出错,无法执行代码。但是一般MATLAB的关键词都会以一定颜色突出显示,当输入关键字后颜色与一般代码一样,就需要检查是否有拼写错误。同时MATLAB的命令是区分大小写的。一般情况下MATLAB自带的函数、命令都为小写状态,如果输入大写状态,则执行不了相应的任务。
这类错误是最低级的错误,也是最容易发现的,一般我们认真、仔细书写代码,可以基本避免此类错误的发生。
【例4.23】 拼写错误的演示。
(1)变量名的拼写错误。
(2)函数名的拼写错误。
找不到函数或者变量的错误,不一定都是拼写错误引起的,如果函数或变量是自己生成的,保存的路径不在MATLAB的搜索路径下,也会出现找不到函数或变量的问题。
(3)参数的拼写错误。
(4)大小写拼写错误。
clear命令可用于清除MATLAB工作空间内的变量,但是如果在大写状态下输入,无法完成相应任务,出错提示如下。
2.语法错误
这类错误主要是指一些函数的不正确使用,或者代码不符合MATLAB的语法规则。此类错误在代码运行后都会出现错误提示,但是有时仅根据错误提示,可能并不能解决问题,还需要整段代码的检查,因为有时前面出错的语句,可能在后面语句中才给出错误提示,但后面语句又没有出错。最典型的就是流程控制语句中,“for”和“end”语句需要配套使用,如果前面缺少了一个“end”,一般只会在程序的最后提示缺少“end”语句。
语法错误一般配合MATLAB的出错提示和函数的帮助文档,基本都能发现,采取相应措施也基本能快速解决。这类错误最容易产生,也最容易发现。
【例4.24】 常见的语法错误的演示。
(1)函数的调用不符合格式要求。
(2)下标访问出错。
在通过下标访问矩阵、数组、向量中的元素时,容易出错的几个地方:超出下标的范围,下标索引从1开始而不是0,且下标索引不能为负数,需要为正整数。
(3)矩阵运算维数不匹配。
在进行矩阵运算时,由于运算符(=、+、-、/、*等)两边的运算对象维数不匹配引起错误。
(4)赋值时变量的大小不统一。
(5)有时变量使用前需要预定义。
当变量需要做累加、累乘等累积运算时,变量需要预先分配一个初始值,因为最初这个变量不存在,无法进行第一次运算,会提示找不到这个变量。
(6)流程控制语句格式不匹配。
3.逻辑错误
一般存在逻辑错误的代码,可以顺利执行,也能得出结果,但是结果往往是不正确的,这类错误是隐藏最深的。程序出错与否也只能通过已知正确结果时程序运行结果的比对。
当发现代码存在逻辑错误时,需要借助于下面将要讲的调试方法来解决。
程序的调试方法有很多种,总体思想是通过查看运行过程中变量值的变化来调试程序。而查看值的变化途径有以下几种。
1.去掉变量末尾的分号
对于程序中的关键变量或者运算可能出错的变量,可以去除这些变量末尾的分号,在命令窗口将显示这些变量。但是如果这些变量数据量比较大,则通过去掉分号完全显示也不是很方便。
2.转换函数文件为脚本文件
对于函数文件,调用完后中间变量不存储在MATLAB的工作空间内,这一点很不利于程序的调试,而本质上函数文件与脚本文件可以达到相同的功能,只需要把函数文件的首行调用格式暂时去除,转换为脚本文件运行。
3.交互控制指令查看程序的运行状况
MATLAB提供了一些交互式控制指令用于在程序运行过程中把操作权交到用户手上。其中,keyboard语句可让程序转入键盘操作状态,此时可以查看已运行的程序生成的变量,函数文件中这些变量暂时存储在MATLAB的工作空间内,因而用于可以在可能出错的语句附件添加keyboard语句;pause语句也可以暂停函数的运行,可以查看中间结果;echo语句可以显示执行的代码,对于函数调用时可以准确获知函数执行了哪些代码。
4.Debugger工具
MATLAB提供了专门的Debugger工具用于程序的调试,Editor窗口中的Debug菜单和标题栏中的
工具条用于程序的调试,下面详细介绍Debugger工具的使用。
Debug菜单用来调试MATLAB的M文件,如图4.10所示,其部分菜单项功能介绍如下。
●Open M-Files when Debugging:调试时打开M文件。
●Step:逐步执行调试程序。
●Step In:进入子函数中逐步执行调试程序。
●Step Out:跳出子函数的调试。
●Continue:执行调试程序,直接从一个断点处运行到下一个断点处。
●Go Until Cursor:调试程序执行到光标所在处。
●Set/Clear Breakpoint:设置或取消指定行的断点。
●Set/Modify Conditional Breakpoint…:设置或修改条件断点。
●Enable/Disable Breakpoint:显示或屏蔽指定行的断点。
●Clear Breakpoints in All Files:清除所有文件中的断点。
●Stop if Errors/Warnings…:在文件调试时,出错或警告时中断程序的调试。
●Exit Debug Mode:退出调试模式。
图4.10 Editor窗口的“Debug”菜单
【例4.25】 程序调试的演示。
(1)光标移动到需要设置“断点”的命令行前,设置断点的方法有快捷键“F12”、菜单Debug→Set/Clear Breakpoint、标题栏工具
。本例中在函数文件的第2行和第7行设置了断点,如图4.11所示,断点语句前将有“小红点”标识。
图4.11 断点的设置
(2)设置完断点后,运行函数,在断点处程序将停止执行,进入调试模式。选择“Step”命令逐步调试执行程序。同时在调试过程中,调试程序执行到的行前将有“绿色的箭头”标识,如图4.12所示。在调试过程中可以查看函数运行的中间变量。如果认为目前所处的调试行至下一个断点处都没有问题,可以选择“Debug”→“Continue”命令,直接转入下一个断点的调试。默认状态下程序调试会跳过子函数,因而如果想调试调用的子函数中的情况,需要使用调试命令“Step In”和“Step Out”。
图4.12 程序调试中
(3)调试后发现有问题的程序及时进行修改,调试完毕,退出调试模式,执行程序。