MATLAB社区

MATLAB,社区和更多

使用链接图进行可视化调试


我要欢迎来自MATLAB技术营销团队的客座博主Ken Atwell。Ken偶尔会在这里写博客Ken和Mike在MATLAB桌面博客。

在MATLAB R2008a中引入了链接图(参见博客入门文章)在这里).如果你不熟悉串联情节,这绝对是一个值得探索的功能。虽然引入链接图主要是为了支持可视化数据探索和操作,但我想写一些附带的好处。金宝app

因为当MATLAB停止时,链接的图会自动用当前数据刷新,所以它们是调试算法的一个很好的视觉辅助工具。在这里,我将使用一个链接图来帮助我跟踪我移植到MATLAB的冒泡排序算法中的一个错误(这避免了一个显而易见的问题:为什么在MATLAB已经提供了一个出色的排序时还需要编写自己的排序排序函数,但这只是一个演示)。首先,我谷歌“冒泡排序C源代码”,然后将第一次命中的C源代码转换为MATLAB等效,记住MATLAB有基于1的索引,而C是基于0的。我得到一个类似这样的函数:

function A = bubbleSort (A) for i=length(A)-1:-1:1 for j = 2:i if A(j-1)>A(j) tmp = A(j-1)(j - 1) = (j);(j) = tmp;端端端端

如果你有敏锐的眼光,你可能已经注意到我没有很好地从0到1的索引转换。如果你测试这段代码,你会看到列表没有正确排序:

>> issorted(bubbleSort(rand(100,1))) ans = 0

为了解决这段代码的问题,我可能选择设置一个断点,在这里我实际更新数组并运行-运行-运行-运行这段代码,可能使用变量编辑器来观察变量a的变化。这可以工作,但这个过程将是乏味的。使用MATLAB的绘图功能将允许我更快速地可视化地发现问题。

我在tmp(第6行)的赋值处放置了一个断点,并发出上面的issorted命令行(更好的是,我可以设置一个运行配置如果我认为我会这样做很多次)。甚至,我可以控制随机数流使我的测试更具可重现性)。调试器停止,我绘制A:

情节(A,“罗”)

然后我通过点击链接情节按钮。现在,我的桌面看起来像这样:

特别要注意的是,图形窗口表明A是一个“链接变量/表达式”。现在我按F5几次来运行MATLAB,一次又一次地点击断点。现在,每当遇到断点时,我都可以看到我的情节更新。但是,我在我的代码中设置了这个断点,我需要按F5几千次才能通过我的算法。这对我来说太细了。我删除了这个断点,并在内部的for循环(第4行)设置了一个新的断点。我运行代码大约25次,我可以更清楚地看到我的算法的行动:

事实上,我现在明白问题所在了。虽然A的上端通常是有序的,但最后一个元素是不有序的。当我将算法从C移植到MATLAB时,我引入了一个偏一的错误。第三行应该是:

for i=length(A):-1:1 % Not length(A)-1 !!

我做了这个更改,重新运行我的issorted命令并运行-运行-运行以确认我的更改是好的。

同样,这里的重点不是开发一个健壮的冒泡排序(MATLAB中已经内置了更好的东西),而是演示如何使用链接绘图创建一个可视化和动态更新的调试界面,以帮助处理大量的数字。更妙的是,我可以在不修改代码的情况下做到这一点我是他的超级粉丝

如果有人有绘制中间结果的调试经验,我很乐意听听。

肯·阿特韦尔,The MathWorks

编者注:巧合的是,道格刚刚就同一主题发表了一篇类似的文章!看看他的记录在这里。

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。