跳转到内容

MATLAB 编程/调试 M 文件

来自维基教科书,开放的书籍,开放的世界


本节解释了如果您修复了所有语法错误(导致实际错误消息的错误),程序运行......但它给出了您不想要的结果,您可以执行的操作。也许它进入了无限循环,也许它循环执行的次数少了一个或多了一个,也许您的“if”语句之一不起作用,也许程序给了您“infinity”或“NaN”作为答案(通常这不太有用!)......出错的可能性与代码中的行数一样多。幸运的是,有一些技术可以用来修复和改进工作中的 MATLAB 代码。

使用 MATLAB 的调试工具

[编辑 | 编辑源代码]

使用调试工具可以让您在程序执行过程中停止以检查变量和其他内容,这可以帮助您找到程序中的错误。

M 文件程序在“断点”处停止。要创建断点,只需按 F12,光标所在行的旁边就会出现一个红点。您也可以单击 M 文件窗口左侧行号旁边的破折号来实现相同的效果。

然后按 F5 或从菜单中选择调试->运行来运行程序。它将在断点处停止,断点旁边有一个绿色箭头。然后,您可以使用调试菜单检查工作区中变量的内容、单步执行、继续或停止程序。要检查变量的内容,只需在工作区中键入它的名称,但请注意:您只能查看停止所在的 文件 中变量的值,这意味着您可能需要多个断点才能找到问题的根源。

从断点开始,您可以通过多种方式遍历程序。一种方法是逐行遍历整个程序,进入调用的每个函数。如果您不知道问题出在哪里,这很有效,但由于它会进入每个函数(包括 MATLAB 函数,如 ode45),因此您可能并不想一直使用它。幸运的是,还有一种方法可以只逐行遍历当前正在停止的函数,而不是逐行遍历子函数,MATLAB 将简单地为您提供这些函数的结果。

最后,请注意,在保存 M 文件之前,您无法设置断点。如果您更改了某些内容,则必须在断点“注意到”您的更改之前保存。MATLAB 通过将点从红色更改为灰色来描述这种情况。有时,您会保存,但点仍然是灰色;当您在多个文件中有多个断点时,就会发生这种情况。要解决这个问题(这真的很烦人),您必须继续“退出调试模式”,直到它变为灰色。完全退出调试模式后,您的文件将保存,您就可以开始新一轮调试了。


使用注释帮助您调试代码

[编辑 | 编辑源代码]

如果您想测试删除某些代码行(例如,查看删除它们后程序是否仍然返回 Inf)的效果,您可以注释掉这些代码。要执行此操作,请突出显示代码,然后转到

Text -> Comment

或按 CTRL+R。这将简单地在每行前面添加一个'%';如果该行已被注释掉,它将在那里添加另一个'%',因此当您取消注释它们时,注释行的模式不会改变。注释行将被编译器忽略,因此效果是程序将运行而不包含它们。

要取消注释一行,请转到

Text -> Uncomment

或按 CTRL+T。

注释的另一个用途是测试两组不同代码执行某项操作的效果(例如,您可能想测试使用 ODE113 而不是 ODE45 求解微分方程的效果,因此您将有一行调用每个函数)。您可以通过注释掉其中一个并运行程序来测试差异,然后取消注释该一个并注释掉另一个,然后再次调用程序。

如何退出无限循环

[编辑 | 编辑源代码]

如果您的程序长时间没有运行,它可能只是运行缓慢(MATLAB 会产生很多开销,如果您没有明智地使用数组,它会变得非常非常慢),但如果您正在测试一个小模块,则更有可能是您有无限循环。虽然 MATLAB 无法直接告诉您存在无限循环,但它确实会尝试提供一些提示。第一个提示是在您终止程序时出现的。通过按 CTRL+C 终止程序,MATLAB 将显示一条消息,告诉您确切地停止在哪一行。如果您的程序运行了很长时间,则您停止的这一行很可能位于无限循环的中间(但请注意,如果循环调用子函数,则您很可能会在子函数中停止,而不是在父函数中。但是,MATLAB 也会告诉您父函数的行,以便您可以轻松地找到循环)。

但是,有时 MATLAB 甚至不会让您返回主窗口以按 CTRL-C。在这种情况下,您可能必须终止整个 MATLAB 进程。之后,在您怀疑是无限循环的循环中添加“pause (0.001)”或类似的小值。每当 MATLAB 执行此指令时,您将能够与 MATLAB 交互(时间非常短),例如,转到主窗口并按 CTRL-C,MATLAB 将能够响应您的命令。

其他调试技巧

[编辑 | 编辑源代码]

在函数内部、循环内或脚本中的任何位置,请使用特殊的注释语法。 %% 是 Cell-mode 注释。通过在感兴趣代码的上面添加  %%,并在代码下面添加另一个  %%,就可以创建一个单元。现在,这个单元可以执行并在内存中修改,而无需保存代码、脚本或函数。通过在  %% 后面添加一些文本,就可以为该单元部分创建一个标题。例如  %% 开始调试无限循环

另一种方法是进入断点,选择感兴趣的部分并将其复制到一个新文件中。现在,可以在这个新文件中更改和测试代码。当修改后的代码按预期工作时,调试会话就可以结束。来自临时文件中的代码可以复制回来,并替换调试后的代码。这种方法让用户可以多次运行这段代码片段,包括  %%,如果该代码应该在 Cell-mode 中运行的话。

除了使用 IDE 运行代码、调试代码或选择断点之外,还可以使用命令行函数。只需输入 db 并按 TAB 键选择函数即可。函数 dbstatus 和 dbstack 是两个可用的函数。使用这些函数进行实验,并使用 help 函数名或选择函数名并按 F1 键。

最后一个调试技巧是在注释中添加可能的代码。例如  % plot(x,y); % 此调试绘图函数使用输入 x 绘制值向量 y 现在,选择 plot(x,y),带或不带  ;,然后按 F9(运行选定的代码)。使用 help 和首选项查找和修改键盘快捷键(如有必要)。在选定的 y 变量上按 CTRL+D 将在变量编辑器中打开它,不要忘记将鼠标悬停在任何变量上,如果可能,将会显示其内容。即使 plot 命令本身也是一个很好的调试工具,因为它可以用来可视化变量。

最后的技巧实际上是一个总结。使用上述方法进行实验,甚至将它们结合起来,以便调试后的代码既能高效运行,又能有有价值的注释,并在需要时提供调试手段。通过添加注释和辅助函数来为编码错误做好计划。创建执行其设计功能的小函数,然后将该函数在完整的程序或脚本中实现。在函数内部,使用 try、catch me 和 me.getReport;如果存在重复的错误,请预期它们会发生并相应地进行编程。无限循环是一个非常常见的错误,因此通过添加功能来发现这个错误可以节省大量时间。另一个技巧可能是单元测试。

华夏公益教科书