【问题标题】:C#/C++: How to visualize muli-dimensional arraysC#/C++:如何可视化多维数组
【发布时间】:2011-05-12 09:16:28
【问题描述】:

例如:一个二维数组可以被可视化为一个带有方形砖块的砖墙,其中每个砖块代表我们数组中的一个坐标。 3 维数组可以以同样的方式可视化为一个盒子或立方体。

但是,这里有一个棘手的部分,您如何可视化具有多个(超过 3 个)维度的数组?或者,对于那部分,您如何可视化一个不仅具有多个维度,而且具有多个层中的多个维度的数组?

例如:如何可视化这样的数组:Array[3,3,3,3][3,3][3,3,3,3,3][3]?

【问题讨论】:

  • 您的数组提供 4x2x.... > 100 个维度。即使是弦理论也只给出了 10 或 12 个维度!
  • @xandy:物理词是一个特别糟糕的类比。 从一点点到几百兆字节,从一微秒到半小时的计算让我们面对完全莫名其妙的 10**9 比率!程序员处于独特的地位,他是唯一一个必须通过单一技术来跨越如此巨大比例的学科和职业。他必须能够根据概念层次进行思考,这些层次比以前单一的思想需要面对的要深得多。 — E. W. Dijkstra
  • @Fred,虽然纯粹的数学家可能会认为这与@xandy 对物理世界的类比一样有限:)
  • @Jon:我敢说 Dijkstra 不会反对:编程是应用数学中最困难的分支之一。 — E. W. Dijkstra,EWD498
  • @Fred:绝对正确。有趣的是,作为一名程序员,我们有如此多的选择。我们可以实例化一个具有数千个索引的数组,其维度比我们容易想象的要多,这一事实令人印象深刻。

标签: c# c++ arrays jagged-arrays


【解决方案1】:

如何可视化数组实际上取决于它们的实际用途。如果您将数组用于空间关系,那么您可以从将其想象为立方体中受益,但您也无需想象超过 3 个维度。如果您真的真的想实现第四个时间维度,您可以想象您的立方体内容随着时间的推移而变化。

否则,您可能会跟踪密切相关的记录。或许每一个第一层元素都是一个星系,第二层元素是星团,第三层元素是太阳系,第四层元素是行星,第五层元素是大陆……

在这种情况下,您可以想象它是数组中的数组。如果你需要一个 4 维数组,那么你可以想象一个立方体,但每个子立方体实际上是一个一维数组。

如果您需要一个 5 维数组,那么您可以想象一个立方体,但每个子立方体都被划分为您的“砖墙”示例。

6 维是一个立方体,每个子立方体都是自己划分的立方体。

这往往会在 6 维之后分崩离析。除此之外,通常还有一个更实际的原因是您需要这么多维度。例如,像 eHarmony 这样的网站通过在 20+ 维空间上使用普通几何来进行匹配。你有一个维度表示“幽默”,一个表示“好看”,一个表示“爱购物”......然后你可以带两个人并应用距离公式(将每个维度差异平方,添加这些差异,平方根) 并确定两个人的兼容性。因此,如果一个人在我们的 9 维人格矩阵上得分为“5、3、9、2、8、4、7、3、1”,而另一个人得分为“9、3、7、1、8、2、8、4” , 7" 那么你的兼容性是:

sqrt((5-9)^2+(3-3)^2+(9-7)^2+...)

这可以应用于无限维度并且仍然有效。但是,由于这些维度不适用于空间,因此无需将它们可视化。相反,在这种特殊情况下,我们实际上可以将其想象为具有多个整数值的一维数组。请注意,我们可以简化这个数组的原因是我们的多维数组只包含一个“1”,其余的都是“0”(表示这个人在这个数组中的位置)。

从 eHarmony 示例移开,重点是 - 在一定数量的维度之后,您通常对数组有实际用途,这有助于感知它的方法。

【讨论】:

  • 非常有趣,而且我的朋友给你一个这样有趣的答案来回答这样一个问题。
【解决方案2】:

有些人可以在心智中为 n > 3 建模 n 维几何,至少就简单的形状而言,有些人不能。 (当我最近与一个从事高级 n 维几何领域的人交谈时得知他无法可视化超立方体时,我感到非常惊讶,而我却发现他的数学远远超出了我的能力)。

但这并不是真的必要。实际上,很少有必要将二维数组可视化为笛卡尔坐标 - 当您在实践中使用二维数组时,您对每个轴都有一些目的,并且该目的很快变得比任何视觉表示都更重要。

如果你确实需要,那么考虑一个二维数组也可以被认为是一组有序的一维结构。同样,一个 3 维数组可以被认为是一组有序的 2 维结构,或一组 1 维(这些组大小相等 - 允许不同大小的物质移动到锯齿状数组中)。

因此,一个 4 维数组可以被认为是一组有序的 3 维结构,依此类推。

【讨论】:

    【解决方案3】:

    你没有。您甚至需要超过 2 或 3 个维度的情况很少见。如果您需要更多,那么也许应该将额外的维度建模为对象的属性,在这种情况下,您可以将它们视为属性,而不是试图想象一些神话般的超立方体。

    【讨论】:

    • 我当然知道并理解您永远不需要(或为此使用)那么大的数组。但是这种极端维度的想法非常令人费解,更不用说讨论有多有趣了。在不太严重的情况下;你的回答让我很开心,谢谢!
    • @Marcus:嗯,就是这样。这莫名其妙。有时尝试和想象这样的事情很有趣,但这并不实际。很高兴你喜欢我的回答:)
    【解决方案4】:

    有许多可爱的方法可以可视化多维数据。我最喜欢的一个是 Alfred Inselberg 的 Parallel Coordinates,它将每个维度表示为垂直轴,将每个数据点表示为连接它们的线程:

    另一个很棒的可视化是 Ramana Rao 的Table Lens (pdf)

    这将每个维度表示为一列,就像在电子表格中一样,但以图形方式而不是数字方式。特别擅长展示维度之间的相关性;当您按一个维度排序时,很容易看到相关维度是如何与它一起排序的。

    【讨论】:

      【解决方案5】:

      尝试减少它。如果你需要想象一个十维数组,那么首先想象所有有限非负整数 n 的所有 n 维实值欧几里得向量空间的集合。 { R0, R1, R2, ... }

      现在想象一下,拿走几乎所有这些,只剩下 R10。

      现在想象一下,去掉几乎所有这些,这样你就只剩下 R10 中的整数格点了。

      现在想象一下,去掉几乎所有这些,你就只有整数格点的一个超矩形子集。

      你就完成了;这是一个很好的 10 维数组的可视化。当您将其视为所有可能的 n 维向量空间集合的子集时,它确实非常小。

      如果您对高维空间的主题感兴趣,您可能想阅读我对高维向量空间数据库搜索算法的一些有趣事实的简要介绍:

      http://blogs.msdn.com/b/ericlippert/archive/tags/high+dimensional+spaces/

      【讨论】:

        【解决方案6】:

        超过 3 个维度,您唯一的选择是树形视图或向下钻取。

        【讨论】:

          【解决方案7】:

          与您可视化 4 spatial dimensions 的方式相同:“切片”、叠加或投影到您已经理解并可以可视化的内容上。

          【讨论】:

            【解决方案8】:

            把每一个额外的维度想象成一个“封闭的盒子”。将 2D 数组视为 1D 数组的数组,将 3D 数组视为 2D 数组的数组,依此类推。

            这里有一些例子......

            一维 1x2 数组:

            [ 1, 2 ]
            

            2D 2x2 数组:

            { [ 1, 2 ], [ 3, 4 ] }
            { [ 5, 6 ], [ 7, 8 ] }
            

            3D 2x2x2 阵列:

            ( { [ 1, 2 ], [ 3, 4 ] }, { [ 5, 6 ], [ 7, 8 ] } )
            ( { [ 9, 0 ], [ 1, 2 ] }, { [ 3, 4 ], [ 5, 6 ] } )
            

            【讨论】:

              【解决方案9】:

              您可以将财务报告可视化为一个数组,其中数据来自电子表格形式的多个实体:

              • 单个销售数据电子表格将是一个二维数组(例如,每个利润中心的季度中每个月的销售额);
              • 工作簿中的多个选项卡(每个子公司一个)将是一个 3D 数组;

              然后,出于全球整合的目的,控制器可能会收到来自每个区域的工作簿 - 这将是第 4 个维度。如果您需要随时间操纵销售数据(例如发现趋势),第五个维度可能是“时间”。

              理论上,您可以在单个 5D 数组变量中保存多年、多地区的销售数据。

              正如人们上面所说,您确实需要首先考虑一个应用程序,然后逻辑数据结构将有助于定义合适的物理形式。任何可以进行关系建模的属性集合都可以正常放入数组中。

              托尼

              【讨论】:

                【解决方案10】:

                将 4D 数组可视化为 1D 立方体数组。一个 5D 数组作为一个 2D 立方体数组。和一个 6D 阵列作为立方体的 3D 阵列,或立方体的立方体。一个 7D 数组作为立方体的一维数组,等等......

                【讨论】:

                  【解决方案11】:

                  忽略这些维度是否需要,为什么不将 4D 数组设想为“立方体”的 1D 数组(线)。 (即:一个 1D 数组,其中每个元素都指向一个 3D 立方体)。这可以根据需要放大(即:每个元素指向一个立方体的二维表面)。这当然不是超立方体的“外观”,但这不是必需的。

                  【讨论】:

                    【解决方案12】:

                    标签:)

                    3 维数据的标签为您提供 4 个维度,标签的标签为您提供 n 维。

                    这不一定是可视化它的最佳方式。也不适合在任何维度上旋转。

                    但是,这取决于您要想象的内容

                    例如,RGB 可以转换为 2D 地图,然后投影到立方体上,为您提供 4d 信息

                    【讨论】:

                      【解决方案13】:

                      这里不打算放弃农场,但这是我如何看待 PHP 中的多维数组的一个示例。

                      $map[room][x][y][z][id][photopath][flag1][flag2]

                      我想象它在 3D 空间中的样子,然后我只添加排序属性。在这里,假设您正在玩《毁灭战士 3》。每张地图都可分为多个房间,这些房间的像素具有 x、y 和 z 坐标。这些点中的每一个都可以有一个与之关联的对象 ID(怪物、项目等)。我为我的应用程序添加了更多属性,但基本上就是这样。数组中的点不一定要在几何上准确;它可以有任何意义。这是否与其他人的做法相似,我不知道。我确实知道使用 gd 图形库可以为动态多维数组制作一个很好的可视化工具,但我上次为这个客户工作时没有进入那个项目。

                      【讨论】:

                        猜你喜欢
                        • 2011-04-03
                        • 2015-02-26
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-10-18
                        • 2019-01-04
                        相关资源
                        最近更新 更多