4

对此的基本方法是打印矩阵。但是当你得到更大的数字时,即使你正在调试(该算法可能不适用于 2 x 2 或 4 x 4 矩阵),它开始变得非常快。

这可以是特定于语言的或与语言无关的,因为我总是可以在调试时将结果打印出来并将它们传送到其他程序。

在这种情况下,您使用什么技巧来发现差异?你使用规范吗?声音的?视频?其他(混合)表示?

我知道这有点含糊,但我不在乎它是否适用于我目前的情况。它可能会在未来出现,而且看看其他人如何进行调试总是很有成效的。

4

6 回答 6

1

根据我的经验,矩阵以表示其实际内容的方式打印 - 您可以创建表示其所有值的字符串,并且在知道它们的大小后,使用空格来调整所有这些值的位置。但是正如您注意到的那样,大矩阵将具有巨大的打印尺寸。

或者,您可以只打印它们的尺寸以及您拥有的一些关于它们的信息 - 如果您创建了 Hilbert 矩阵并且您没有更改任何内容,您可以显示有关此的通知。

如果您受限于toString()方法或其等效方法,您必须决定哪些信息对您最重要。但通常——无论是客观语言还是结构化语言——您都可以简单地创建一些专门用于显示不同部分信息的类/函数。

更重要的是,在调试过程中,例如 Java,您可以使用表达式调用对象上的某些方法,因此可以仅显示维度,toString()但可以创建单独的方法 ( dump()?) 以完整显示其内容。

如果您不能使用表达式和/或断点,您可以 - 仅出于调试目的 - 将所有附加信息写入文件而不是控制台。例如,在 C 中,您可以在输出流中使用一些全局变量 - 例如 null 表示根本不显示任何内容,或者如果您设置了标准输出/文件。

总而言之,这在很大程度上取决于您选择的语言。它会自动确定哪些方法被确认为干净。但是存储附加信息、创建多种显示方式或级别并选择您需要的信息,对我来说听起来是个好主意。

例如,我将如何在 Java 中解决这个问题:

  • 覆盖toString()以显示类似的内容[matrix: 4x4, square(det = 5.33323, dim = 3)]

  • 创建dump()方法以返回具有所有值的格式化字符串,

  • 创建dumpForMatlab(File)以 Matlab/Octave 格式存储矩阵的方法。

调试期间:

  • 基本信息将在对象预览中可用,

  • 表达式将显示完整的矩阵,当我想看看它内部是否发生了变化时,

  • 更深入的分析将由 Matlab/Octave 或其他专用于处理矩阵的工具完成。

当然,如果我使用 CI 会改变我的方法以匹配语言和可用工具。

于 2013-05-05T13:04:48.157 回答
1

可能会有所帮助。它提供了一个插件,可以在调试时可视化大型数组。

于 2013-05-06T10:09:29.433 回答
1

如果您的矩阵表示高维数据,例如每一行都是一个数据样本,其中每个数据点都是高维的。执行主成分分析很有用。这会降低数据的维度。因此,您可以将其降低到二维并在图表上打印数据。如果您想为数据拟合曲线,但不知道要拟合哪种曲线(线性、多项式、正弦曲线等),这非常有用。查看此链接以了解有关 PCA 的更多信息。

于 2013-05-06T13:53:57.700 回答
1

有一个重要规则:检索您在数据中查找的内容的时间。这通常包括:

  • 导出数据的时间(序列化/转储)
  • 处理数据的时间(导入和清理/过滤)
  • 寻找你正在寻找的东西的时间(定位)

根据您想要显示的内容,我通常会这样:

  • 聚合/减少数据集,以便您可以只显示您想看到的内容。例如:a 到 b 之间的值、日期在 D 之前等……</li>
  • 以有效的方式显示数据。显然,NxN 通常可以表示为图像,这是在屏幕上显示某个东西的最自然方式,如果它是 1xN,是否有可以依赖的周期性来制作矩阵而不是这个数组?
  • 使用颜色:为您感兴趣的值着色。使用颜色可以有效地让大脑定位相关值。想想赤字以红色显示的会计。
  • Unse动画:比颜色更难,闪烁值与颜色一样快。

注意:我可能会继续使用 3D,即将 3D 中的数据转换为更好地可视化它而不是音频(只要您的数据集显然与音频本身没有直接关系)。

在编码方面:

  • 仍然有内部调试器,使用 GCC,您可以在控制台中调用一些功能,例如打印对象或编辑摘要格式。当您处于断点并且只是想知道什么是某事时,这些是有效的[某处];或者只是愿意更好地显示您的自定义数据块结构。在任何脚本语言中,您都可以在断点中或在数据存在时随时执行此操作。使用外部工具如下:
  • 最快但最糟糕的方法是将当前内存转储到文件中,然后您将能够分析或读取它,例如十六进制阅读器(某些代码编辑器确实具有此功能)。
  • 第二种方法是为此任务使用电子表格,然后您可以将数据导出为 CVS 格式,您只需要编写正确的序列化程序即可。这很好,特别是如果您想制作一些数据图表……</li>
  • 我有时使用的第三种方法是以 JSON 格式导出数据,JSON 格式比 XML 更好,因为任何序列化的内容都可以被解析回来并使用与导出相同的结构。无论如何......然后构建一个小网页来加载和显示您的数据非常容易。当我使用 http 时,我经常使用这个技巧来验证算法的正确性。对于大量转储,您还可以将 jSON 导入到 nosql 数据库,例如 MongoDB(用于 JSON),或者如果您在 CVS 中导出到 sql 数据库中。
  • 显然,如果您使用带有 GUI 的语言,则在画布中编写自己的绘图可能是一种选择,快速可视化但需要长时间编码才能获得结果(考虑为此使用框架)。
  • 导出为 Mathlab / GNU Octave 格式将允许您使用它内置的可视化分析工具和绘图
  • 我有时使用并且我真正喜欢的一个很好的交易是将数据导出为 32 位图像。然后可以在包括 mathlab 在内的任何图像编辑器中打开此图像,也可以在任何图像编辑器(如 gimp / photoshop)中打开此图像。如果您需要编写自己的图像分析器,您可以尝试 ImageJ 或(更有趣)简单地使用着色器构建器,例如http://glsl.heroku.com最后一个选项是一个很好的选项,因为您仍然可以同时处理数据和代码来处理/显示它。对于 OSX 用户,有 OpenGL Shader Builder,它也可以作为桌面应用程序。最后一种方法对我来说真的很重要,因为您可以真正通过纹理导入数据,然后对着色器进行编码,最后调整输入参数(例如可能是阈值)以实时查看结果。正如我在一开始所写的那样,从导出到本地化您要查找的内容之间的时间很重要。由于您的 OpenGL 和大脑,使用这种方法可以大大减少搜索的处理和时间。
于 2013-05-06T15:42:21.657 回答
0

我更喜欢使用图形绘图库。很容易缩放输入,并以所需的间隔查看样本,或查看整个图片。

于 2013-05-06T12:29:12.783 回答
-3

在我看来,算法中的大矩阵让你了解算法结构。如果您想查看结果,控制台和打印结果字符串都可以。

于 2015-11-25T13:37:45.807 回答