Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何表示算法中的大型矩阵以帮助您进行调试?_Arrays_Matrix_Sparse Matrix_Data Representation - Fatal编程技术网

Arrays 如何表示算法中的大型矩阵以帮助您进行调试?

Arrays 如何表示算法中的大型矩阵以帮助您进行调试?,arrays,matrix,sparse-matrix,data-representation,Arrays,Matrix,Sparse Matrix,Data Representation,基本方法是打印矩阵。但是,当你得到更大的数字时,即使你正在调试(该算法可能不适用于2乘2或4乘4矩阵),它也会很快变得毛茸茸的 这可以是特定于语言的,也可以是与语言无关的,因为我总是可以打印结果,并在调试时通过管道将结果传输到其他程序 在这种情况下,您使用什么技巧来发现差异?你使用标准吗?音频视频 其他(混合)陈述 我知道这有点模糊,但我不在乎它是否适用于我目前的情况。将来可能会出现这种情况,看到其他人如何进行调试总是很有成效的。根据我的经验,矩阵是以表示其实际内容的方式打印的-您可以创建表示其

基本方法是打印矩阵。但是,当你得到更大的数字时,即使你正在调试(该算法可能不适用于2乘2或4乘4矩阵),它也会很快变得毛茸茸的

这可以是特定于语言的,也可以是与语言无关的,因为我总是可以打印结果,并在调试时通过管道将结果传输到其他程序

在这种情况下,您使用什么技巧来发现差异?你使用标准吗?音频视频 其他(混合)陈述


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

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

或者,您可以只打印它们的尺寸以及一些关于它们的信息——如果您创建了希尔伯特矩阵,并且您没有更改任何内容,那么您可以显示关于这一点的通知

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

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

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

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

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

  • 覆盖
    toString()
    以显示类似
    [矩阵:4x4,正方形(det=5.33323,dim=3)]
    ,

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

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

调试期间:

  • 基本信息将在对象预览中提供

  • 表达式将显示完整的矩阵,当我想看看里面是否有变化时

  • 更深入的分析将由Matlab/Octave或其他致力于矩阵工作的工具完成


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

可能会有所帮助。它提供了一个在调试时可视化大型阵列的插件。

我更喜欢使用图形绘制库。
很容易缩放输入,按要求的间隔查看样本,或查看整个图片。

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

有一条重要规则:从数据中检索所需内容的时间。这通常包括:

  • 导出数据的时间(序列化/转储)
  • 处理数据的时间(导入和清理/筛选)
  • 找到您要查找的内容的时间(定位)
根据您希望显示的内容,我通常会这样做:

  • 聚合/减少数据集,以便仅显示希望看到的内容。例如:a到b之间的值,日期在D之前等
  • 以有效的方式显示数据。显然,NxN通常可以表示为图像,这是在屏幕上显示某个内容的最自然的方式,如果它是1xN,是否有一个周期性可以用来生成矩阵而不是数组
  • 使用颜色:为您感兴趣的值着色。使用颜色可以有效地让大脑定位相关值。想一想赤字显示为红色的会计
  • Unse动画:比颜色困难得多,闪烁的值和颜色一样容易被注意到
注意:我可能会使用3D,即在3D中转换数据以更好地显示数据,但不会转换为音频(只要数据集显然与音频本身没有直接关系)

在编码方面:

  • 还有内部调试器,使用GCC,您可以在控制台中调用一些函数,例如打印对象或编辑摘要格式。当你在一个断点,只是想知道什么是某物(某处)时,这些方法是有效的;或者只是希望更好地显示数据块的自定义结构。在任何脚本语言中,您都可以在断点中或数据存在时随时执行此操作。使用外部工具的步骤如下:
  • 最快但最糟糕的方法是将当前内存转储到文件中,然后