2010-11-19 43 views
6

例如:一个二维数组可以像方砖一样的砖墙显示,其中每个砖代表我们数组中的一个坐标。一个三维数组可以用相同的方式可视化为一个盒子或立方体。C#/ C++:如何可视化多维数组

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

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

+3

您的数组给出4x2x ....> 100个维度。即使弦理论只给出10或12维! – xandy 2010-11-19 00:28:54

+3

@xandy:物理词是一个特别差的比喻。 *从一点到几百兆字节,从微秒到半小时的计算会让我们以10 \ * \ * 9的完全莫名其妙的比率!程序员处于独特的地位,他是唯一的学科和专业,在这个学科和专业中,如此巨大的比例,完全阻碍了我们的想象力,必须通过单一技术弥合。他必须能够从概念层次上进行思考,这比以往任何时候需要面对的单一思维都要深刻得多。* - EW Dijkstra – 2010-11-19 00:33:29

+0

@Fred,尽管纯数学家可能会认为像@ xandy的类比物理世界:) – 2010-11-19 00:44:02

回答

9

你如何形象化数组真的取决于他们的实际使用。如果你使用数组作为空间关系,那么你可以将它想象成一个立方体,但你也失去了想象超过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的例子,重点在于 - 在一定数量的维度之后,您通常对数组有实际意义,因为它有助于感知它的方法。

+0

非常有趣,加上一个给你我的朋友用这样一个有趣的答案回答这样一个问题。 – 2010-11-19 00:59:48

4

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

+1

当然,我知道并且明白,你不需要(或者用于这个问题)那个大阵列。但是,这样的极端维度的想法是相当莫名其妙的,更不用说它是多么有趣的讨论。不太重要的一点是,你用这个答案让我的一天,谢谢你! – 2010-11-19 00:44:21

+0

@马库斯:好的,就是这样。它*是*莫名其妙。有时试图想象这种事情很有趣,但它不实际。很高兴你喜欢我的回答:) – mpen 2010-11-19 07:21:58

1

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

5

有些人可以为n> 3精神建模n维几何图形,至少就简单形状而言,有些人不能。 (当我最近与某个领域的高级n维几何学家交谈时,我发现他无法想象超立方体,而我却可以发现他的数学超出了我),我感到非常惊讶。

虽然这并不是必要的。事实上,将笛卡尔坐标变换为二维数组并非特别必要 - 当您在实践中使用二维数组时,您对每个坐标轴都有一定的目的,并且该目的快速变得比任何视觉表示都更重要。

如果您确实需要,那么可以考虑二维数组也可以被认为是一维有序的一维结构。同样,一个3维数组可以被认为是二维结构的有序集合,或者是一组1维的集合(这些集合具有相同的大小 - 允许不同大小移动成锯齿状阵列)。

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

0

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

0

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

0

凸片:) 3个维数据的

分页让你4米的尺寸,翼片的翼片给你Ñ维。

这不一定是想象它的最佳方式。也不适合在任何尺寸中旋转。

但随后,这取决于你想什么想象

RGB例如可以变成2D地图,然后投射到一个立方体,给你4D信息

1

觉得每一个额外的维度作为一个“封闭盒子”。将2D阵列想象为1D阵列的阵列,将3D阵列看作2D阵列的阵列等等。

下面是一些例子...

1D 1x2的阵列:

[ 1, 2 ] 

2D 2×2阵列:

{ [ 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 ] }) 
3

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

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

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

现在想象几乎所有这些,以便您只有一个超矩形子集的整数格点。

你完成了;这是一个10维阵列的良好可视化。当你将它看作所有可能的n维向量空间集合的一个子集时,它确实非常小。

如果高维空间的主题感兴趣的内容,你可能想要看我的温柔介绍有关搜索算法对高维向量空间数据库的一些有趣的事实:

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

2

有许多可视化多维数据的方式。我最喜欢的是阿尔弗雷德岛山的Parallel Coordinates,这表示每个维度作为纵轴,而每个数据点作为一个线程将它们连接所有:

alt text

另一个伟大的可视化是拉玛纳饶Table Lens (pdf)

alt text

这将每个维表示为一列,如电子表格中的图形,而不是数字。它特别擅长显示尺寸之间的相关性;当你按一个维度排序时,很容易看出相关维度如何排列在一起。

0

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

$图[资讯] [X] [Y] [Z] [ID] [photopath] [标志1] [FLAG 2]

我想象它会是什么样子在3D空间中的点,然后我只需添加排序属性。在这里,假设你正在玩Doom 3.每张地图都可以分割成多个房间,这些房间的像素有x,y和z坐标。每个点都可以有一个与之关联的对象ID(怪物,物品等)。我为我的应用程序添加了更多属性,但基本上这是它。阵列中的点不一定必须是几何精确的;它可以有任何意义。这与其他人的做法是否相似,我不知道。我知道使用gd图形库将为飞行中的多维数组创建一个很好的可视化工具,但是我上次为该客户端工作时没有找到该项目。

0

你可以想象一个财务报告作为一个数组,其中数据是从多个实体进来以电子表格形式:

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

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

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

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

tony