对此的基本方法是打印矩阵。但是当你得到更大的数字时,即使你正在调试(该算法可能不适用于 2 x 2 或 4 x 4 矩阵),它开始变得非常快。
这可以是特定于语言的或与语言无关的,因为我总是可以在调试时将结果打印出来并将它们传送到其他程序。
在这种情况下,您使用什么技巧来发现差异?你使用规范吗?声音的?视频?其他(混合)表示?
我知道这有点含糊,但我不在乎它是否适用于我目前的情况。它可能会在未来出现,而且看看其他人如何进行调试总是很有成效的。
对此的基本方法是打印矩阵。但是当你得到更大的数字时,即使你正在调试(该算法可能不适用于 2 x 2 或 4 x 4 矩阵),它开始变得非常快。
这可以是特定于语言的或与语言无关的,因为我总是可以在调试时将结果打印出来并将它们传送到其他程序。
在这种情况下,您使用什么技巧来发现差异?你使用规范吗?声音的?视频?其他(混合)表示?
我知道这有点含糊,但我不在乎它是否适用于我目前的情况。它可能会在未来出现,而且看看其他人如何进行调试总是很有成效的。
根据我的经验,矩阵以表示其实际内容的方式打印 - 您可以创建表示其所有值的字符串,并且在知道它们的大小后,使用空格来调整所有这些值的位置。但是正如您注意到的那样,大矩阵将具有巨大的打印尺寸。
或者,您可以只打印它们的尺寸以及您拥有的一些关于它们的信息 - 如果您创建了 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 会改变我的方法以匹配语言和可用工具。
可能这会有所帮助。它提供了一个插件,可以在调试时可视化大型数组。
如果您的矩阵表示高维数据,例如每一行都是一个数据样本,其中每个数据点都是高维的。执行主成分分析很有用。这会降低数据的维度。因此,您可以将其降低到二维并在图表上打印数据。如果您想为数据拟合曲线,但不知道要拟合哪种曲线(线性、多项式、正弦曲线等),这非常有用。查看此链接以了解有关 PCA 的更多信息。
有一个重要规则:检索您在数据中查找的内容的时间。这通常包括:
根据您想要显示的内容,我通常会这样:
注意:我可能会继续使用 3D,即将 3D 中的数据转换为更好地可视化它而不是音频(只要您的数据集显然与音频本身没有直接关系)。
在编码方面:
我更喜欢使用图形绘图库。很容易缩放输入,并以所需的间隔查看样本,或查看整个图片。
在我看来,算法中的大矩阵让你了解算法结构。如果您想查看结果,控制台和打印结果字符串都可以。