MATLAB编程-简介
程序运行但结果错误时该怎么办
本节介绍当你修复了所有语法错误(即那些会报错的信息),程序可以运行,但结果不是你想要的时该怎么办。比如程序进入了无限循环;循环次数比预期少一次或多一次;某个 if
语句没起作用;结果是 Inf
或 NaN
(通常没什么用)……总之,代码中每一行都可能出错。
幸运的是,有一系列技术可以用来修复错误,也可以改进可正常运行的 MATLAB 代码。
使用 MATLAB 的调试工具(Debugging Tool)
调试工具可以在程序运行过程中中断执行,让你检查变量内容等信息,从而帮助定位问题。
M 文件程序的中断点叫做“断点(breakpoint)”。设置断点的方法如下:
-
在编辑器中,按 F12,该行左侧会出现一个红点;
-
或者点击 M 文件窗口左侧行号旁的短横线。
然后按 F5 或通过菜单选择 Debug → Run 运行程序,程序会在断点处暂停,该行旁边会出现一个绿箭头。你可以查看变量、单步执行、继续运行或终止程序,相关选项都在 Debug 菜单中。
要查看变量,只需在命令窗口输入变量名。但注意:只能查看当前中断函数作用域中的变量,因此你可能需要设置多个断点,才能找到问题源头。
你可以使用不同方式从断点继续执行程序,例如:
-
单步执行每一行,包括所有子函数(哪怕是内建函数如
ode45
); -
或仅单步执行当前函数中每一行,而不进入子函数,只查看其返回结果。
⚠️ 注意:在设置断点前,你必须保存文件。若文件已更改但未保存,断点会显示为灰色而非红色。如果你保存后仍然是灰色,可能是因为在多个文件中设置了断点。此时你需要不断“退出调试模式”,直到完全退出,才能再次保存并重新调试。
使用注释帮助调试
如果你想测试去掉某几行代码对结果的影响(例如判断程序是否仍然输出 Inf
),可以使用注释将其屏蔽:
-
选中代码,点击菜单 Text → Comment;
-
或使用快捷键 Ctrl+R。
这样每行前会添加 %
。如果行本身已被注释,则会再加一个 %
,以便恢复时保持注释结构不变。
取消注释的方法:
-
菜单:Text → Uncomment;
-
快捷键:Ctrl+T。
注释也可以用于测试两段不同代码的效果,例如比较 ODE113
与 ODE45
解微分方程的表现。你可以将其中一行注释,运行程序,再注释另一行切换测试。
如何退出无限循环
如果程序很久没响应,可能是计算慢,也可能是陷入无限循环。虽然 MATLAB 无法直接识别无限循环,但它会在你终止程序时提供线索。
按 Ctrl+C 可以终止程序,MATLAB 会告诉你在哪一行中断。如果这行在循环中间,大概率你就找到了无限循环的所在。但如果循环中调用了子函数,可能中断点会在子函数中,不过 MATLAB 会提供调用栈信息,可以回溯父函数的出错行。
但有时 MATLAB 甚至无法返回主界面让你按 Ctrl+C,这种情况下你可能需要强制结束整个 MATLAB 进程。
建议在你怀疑的循环中加入如下语句:
pause(0.001)
每次循环 MATLAB 都会“暂停”极短时间,让你有机会按 Ctrl+C 干预。
其他调试技巧
使用 Cell 模式注释 (%%
)
在函数或脚本中,可使用 %%
创建 代码块(Cell),示例:
%% 开始调试无限循环
for ...
end
%% 结束调试
每个 Cell 可以独立执行,无需保存文件,便于快速测试和修改。
将调试代码复制到新文件中
在断点中复制出“问题段”代码,新建一个 .m 文件进行修改测试。调试完成后,再将代码复制回原文件。你也可以为 Cell 模式代码段添加注释标题并多次运行。
使用命令行调试函数
不用编辑器也可通过命令行调试,输入 db
后按 Tab 查看相关函数,如:
-
dbstatus
:查看断点状态; -
dbstack
:查看调用栈。
也可通过 help functionname
或选中函数名按 F1 查看帮助。
在注释中嵌入调试代码
例如:
% plot(x,y); % 这行可用于调试:绘制变量 y 对 x 的关系
选中 plot(x,y)
后按 F9 可运行此段代码。选中变量名按 Ctrl+D 可在变量编辑器中查看内容。鼠标悬停变量上也可预览其值。plot
本身就是一种极好的调试工具,用于可视化变量变化。
总结建议
-
多尝试上述方法,并结合使用,提高调试效率;
-
用注释、函数模块划分来计划和预防错误;
-
尽量写小函数完成特定任务,再整合到主程序中;
-
在函数内部使用
try-catch
和me.getReport
捕获错误信息; -
针对常见错误(如无限循环)提前编写检测与应对逻辑;
-
还可以引入 单元测试 方法验证代码正确性。
这些方法将大大提升你调试 MATLAB 程序的能力。