YunSDR小课堂-MATLAB与Simulink入门(第95讲)

B.1 MATLAB 介绍

MATLAB广泛应用于所有应用数学领域,以及大学教育与科研和工业界。MATLAB代表矩阵实验室,软件核心基于向量和矩阵构建。因此,该软件尤其适合解决线性代数问题,同时也能用于代数方程、微分方程及数值积分的求解。

MATLAB拥有一套图形工具,能够生成高级二维和三维图形用户界面及数据绘图。MATLAB还配备多个工具箱,支持通信、信号处理、图像处理、优化及其他专业操作。

B.2 常用 MATLAB 工具

本节介绍了查找误差的一般方法,以及利用自动代码分析功能检测MATLAB代码中可能的改进点。特别介绍位于编辑器中的MATLAB调试器功能,以及等效的命令窗口调试功能。

调试是定位并修复代码问题的过程。

调试有助于纠正两类误差:

•语法误差:例如拼写错误的函数名或遗漏括号。

•运行时误差:这类误差通常源于算法方面的问题。例如,可能修改了错误的变量或错误地编写了计算。运行时误差通常在M文件产生意外结果时显现。运行时误差难以追踪,因为错误导致返回MATLAB基础工作区时,函数的局部工作区信息会丢失。

B.2.1 代码分析及M-Lint消息

MATLAB能够通过消息检查代码中的问题,并推荐修改以最大化性能和可维护性,这些消息有时称作M-Lint消息。Lint一词来源于C等其他编程语言中类似工具的名称。在MATLAB中,M-Lint工具会为其判定有改进潜力的M文件每一行代码显示消息。例如,一个常见的M-Lint消息是变量在M文件中被定义但从未使用。

您可以通过三种不同方式检查编码问题,所有方式均报告相同的消息:

•在编辑器中工作时持续检查代码。查看M-Lint消息,并根据消息修改文件。这些消息会自动且持续更新,便于您查看更改是否解决了消息中指出的问题。部分消息提供扩展信息、自动代码修正,或两者兼具。

•对现有MATLAB代码文件运行报告:在编辑器中打开文件,选择工具>代码分析器>显示代码分析报告。

•对文件夹内所有文件运行报告:在当前文件夹浏览器中,点击操作按钮,选择报告>代码分析器报告。

针对每条消息,审查该消息及相关代码,并根据以下流程修改代码本身:

•点击行号,即可在编辑器/调试器中打开该行对应的M文件。

•请检查报告中的M-Lint消息,并依据消息修改M文件中的代码。

•请注意,在某些情况下,应避免根据M-Lint消息进行修改,因为这些消息并不适用于特定情况。M-Lint并非对所有情况提供完全准确的信息。

•保存M文件。若进行了可能引入误差的重要更改,建议另存为不同的文件名。这样,在解决更新文件的问题时,您可以参照原始文件。

•如果不确定消息含义或应如何修改代码,请使用帮助浏览器查找相关主题。

您也可以使用mlint函数获取M-Lint消息。有关此函数的更多信息,可在命令窗口中输入help mlint。请参阅在线文档[3]以了解该工具的详细说明。

B.2.2 调试器

MATLAB编辑器、图形调试器及MATLAB调试功能对于纠正运行时问题非常有帮助。它们能够访问函数工作区,并检查或修改其中包含的值。您还可以设置和清除断点,断点是用于暂时暂停文件执行的标志。在断点处暂停时,您可以切换工作区上下文,查看函数调用堆栈,并逐行执行文件中的代码。

调试中有两项关键技术:一是断点,另一是单步执行。设置断点以暂停函数执行,使您能够检查怀疑存在问题的数值。

调试时,您还可以通过单步执行M文件,在希望检查值的位置暂停。

M文件中可以设置的断点有三种基本类型:

•标准断点,在M文件指定行停止执行。

•条件断点仅在指定的M文件中特定行且满足指定条件时才会暂停执行。

•误差断点会在任何M文件生成指定类型的警告、误差、NaN或无穷值时暂停执行。

当MATLAB处于忙碌状态时(例如运行M文件,除非该M文件在断点处暂停),无法设置断点。程序暂停时,您可以查看工作区中任意变量的当前值,从而检查代码行是否产生预期结果。如果结果符合预期,则继续运行或逐步执行到下一行。如果结果不符合预期,则该行代码或之前的某行代码存在误差。

调试过程中,您可以修改当前工作区中变量的值,以验证新的变量值是否产生预期结果。当程序暂停时,可在命令窗口、工作区浏览器或数组编辑器中为变量赋予新值,然后继续运行或逐步执行程序。如果新值未产生预期结果,则程序可能存在不同的或其他问题。

除使用图形用户界面的编辑器外,还可以通过命令窗口使用调试函数调试MATLAB文件,或交替使用这两种方法。有关该工具的更多信息,请参阅在线文档[4]。

B.2.3 性能分析器

性能分析是一种测量程序执行各功能所用时间的方法。利用MATLAB性能分析器,您可以识别代码中耗时最多的函数。随后,您可以分析调用原因并寻找减少调用次数的途径。通常,判断某函数的调用次数是否合理非常重要。由于程序通常包含多个层次,您的代码可能不会显式调用耗时最长的函数。相反,代码中的某些函数可能调用了其他耗时较多的函数,这些函数可能位于代码的多个层级之下。在这种情况下,确定哪些函数引发此类调用非常重要。

性能分析有助于发现您可以通过以下方法解决的性能问题:

•避免由于疏忽而产生的不必要计算。

•更改算法以避免调用高成本函数。

•通过存储结果以供后续使用来避免重复计算。

当程序大部分时间都花费在少数内置函数调用上时,说明您已基本达到代码优化的极限。您可以使用以下任一方法打开分析器:

•在MATLAB桌面环境中,选择Desktop→ Profiler。

•MATLAB菜单中选Tools → Open Profiler。

编辑器/调试器。

•在命令历史窗口中选择一个或多个语句,右键单击以显示上下文菜单,然后选择Profile Code。

•在命令窗口输入以下函:profile viewer。