C#/ C ++:如何可视化多维数组

时间:2010-11-19 00:23:41

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

例如:二维数组可以像砖墙一样用方形砖可视化,其中每个砖代表我们阵列中的一个坐标。三维数组可以以相同的方式显示为框或立方体。

但是,这是一个棘手的部分,你如何可视化具有多个(超过3个)维度的数组?或者,对于那个部分,如何使用多个维度,但多个维度中的多个维度可视化数组?

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

13 个答案:

答案 0 :(得分:10)

如何可视化阵列实际上取决于它们的实际用途。如果您使用数组进行空间关系,那么您可以将其想象为多维数据集,但您也无需想象超过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示例,重点是 - 在一定数量的尺寸之后,您通常具有阵列的实际目的,这有助于感知它。

答案 1 :(得分:5)

有些人可以在心理上为n维几何建模n> 3,至少就简单的形状而言,有的不能。 (当我最近和那些领域已经推进了n维几何学的人交谈以了解他无法想象一个超立方体时,我感到非常惊讶,而我可以发现他的数学远远超出我的范围。)

虽然这不是必要的。实际上,很少有特别需要将二维数组可视化为Cartesiancoördinates - 当你在实践中使用二维数组时,每个轴都有一些目的,而且这个目的很快就变得比任何视觉表现更重要。 / p>

如果确实需要,那么可以考虑将二维数组视为一组有序的一维结构。同样地,三维数组可以被认为是二维结构的有序集合,或者是一组一维的集合(具有相同大小的这些集合 - 允许不同的大小将事物移动到锯齿状阵列中)。

因此,可以将四维数组视为三维结构的有序集,依此类推。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

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

现在想象几乎所有这些都被拿走了,所以你只剩下R10中的整数格点。

现在想象几乎所有这些都被拿走了,所以你只有整数格点的超矩形子集。

你已经完成了;这是10维数组的良好可视化。当你把它看作是所有可能的n维向量空间集合的一个子集时,它真的很小。

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

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

答案 4 :(得分:3)

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

alt text

另一个伟大的可视化是Ramana Rao的Table Lens (pdf)

alt text

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

以同样的方式显示4 spatial dimensions:“切片”,叠加或投影到您已经理解并可以想象的内容上。

答案 7 :(得分:1)

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

以下是一些例子......

1D 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 ] } )

答案 8 :(得分:1)

您可以将财务报表可视化为数据,其中数据以电子表格形式从多个实体进入:

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

然后,出于全局整合的目的,Controller可能会从每个区域收到一个工作簿 - 这将是第四个维度。第五个维度可能是" time"如果您需要随着时间的推移操纵销售数据(例如,发现趋势)。

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

标签:)

三维数据的标签为您提供了4个维度,标签的标签为您提供了维度。

这不一定是将其可视化的最佳方式。也不适合在任何尺寸上旋转。

但是,这取决于你想要想象的是什么

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

答案 12 :(得分:0)

不打算在这里放弃这个农场,但这是我在PHP中查看多维数组的一个例子。

$地图[室] [X] [Y] [Z] [ID] [photopath] [FLAG1] [FLAG2]

我想象它在3D空间中看起来像什么,然后我只是添加排序属性。在这里,假设您正在玩Doom 3.每个地图都可以分割成房间,其中包含带有x,y和z坐标的像素。这些点中的每一个都可以具有与其相关联的对象id(怪物,项目等)。我为我的应用程序添加了更多属性,但基本上就是这样。数组中的点不一定必须是几何精确的;它可以有任何意义。这是否与其他人的相似,我不知道。我知道使用gd图形库可以动态地为多维数组制作一个很好的可视化工具,但是上次我为这个客户工作时,我没有进入那个项目。