“第四维”如何与数组一起使用?


30

抽象:

因此,据我了解(尽管我了解的非常有限),我们(通常)在物理上涉及三个方面:

第一个将由一条线表示。
第二个将由一个正方形表示。
第三个将由一个多维数据集表示。

很简单,直到我们进入第四位 -如果您知道我的意思,那么很难在3D空间中绘制...有些人说这与时间有关

问题:

现在,尽管这并没有多大意义,但对我来说,这一切都很棒。我的问题不是这个,或者我会在MathSO或PhysicsSO上问它。我的问题是:计算机如何处理数组?

我知道您可以使用许多不同的编程语言创建4D,5D,6D等数组,但是我想知道它是如何工作的。


66
如果3个维度可以可视化为一个多维数据集,则4个维度可以可视化为一行中的一堆多维数据集。5个维度可以可视化为一个网格,其中网格中的每个单元格都包含一个立方体!等等......“第四维”无关,同时间做(无论是),除非你在你的程序的语义的情况下将其定义为这样的。
FrustratedWithFormsDesigner 2014年

14
通常,可以通过避免将尺寸视为严格的物理构造来克服这种概念上的困难。例如,某些机器学习问题可能具有数十万个维度,其中每个维度都是数据集的一个特征。
史蒂文·埃弗斯


6
除了史蒂夫·埃弗斯(Steve Evers)的评论,还要考虑一种常见的数据类型:RGB颜色。它具有三个维度,因此您可以考虑RGB“颜色空间”。现在添加一个alpha组件。您有四个维度。
乔什·卡斯韦尔

25
请记住,计算机并不关心几何尺寸的概念,它们只是为人类提供便利的设备。如果您分配5x5x5x5数组,则计算机仅分配625个元素的数组,并相应地对索引进行数学运算。
David Zhang

Answers:


77

幸运的是,程序不受现实世界的物理限制。数组不存储在物理空间中,因此数组的维数无关紧要。它们被压平到线性存储器中。例如,具有两个元素的一维数组的布局可能为:

(0) (1)

2x2维数组则可能是:

(0,0) (0,1) (1,0) (1,1)

三维2x2x2数组可能是:

(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1)

您可以希望看到它的去向。四个维度可能是:

(0,0,0,0) (0,0,0,1) (0,0,1,0) (0,0,1,1) (0,1,0,0) (0,1,0,1) (0,1,1,0) (0,1,1,1)
(1,0,0,0) (1,0,0,1) (1,0,1,0) (1,0,1,1) (1,1,0,0) (1,1,0,1) (1,1,1,0) (1,1,1,1)

10
计算机阵列不受人类理解或可视化的限制,但受到物理约束的限制,例如,每个长度为n的d维数组将占用n ^ d,或更一般地说,具有不同的长度维为n1×n2×…× nd。
acelent

6
@ColtonAllen:我不太确定您指的是什么。尺寸定义说:“大致来说,它是在对象上指定点所需的坐标数。” 在C中声明为int a[2][2][2];3维数组的数组。
格雷格·休吉尔

4
“幸运的是,程序并不受现实世界的物理限制。”因此,这就是为什么我们所有人都拥有4.5THz的处理器,而没有人关心内存层次结构,不是吗?这真是最搞笑的答案我已经readed ....
Manu343726

24
@ Manu343726他指的是我们生活在(理论上)有限的空间和时间维度上的事实,但是计算机内存中的数组具有“假装”的维度-它们都存储在内存中线性连续的空间中-因此它们不限于我们居住的维度数量。请勿拖曳> :(
Blackhawk

15
@ Manu343726:我仔细地说了程序,而不是计算机。那是关于软件的伟大事物之一。
格雷格·休吉尔

49

您无需在高空间维度上进行想象,只需将其视为蕨叶即可。 蕨叶

主茎是您的第一个数组,每个分支都是它要存储的项。如果我们看一个分支,这是您的第二个维度。它具有类似的结构,其中较小的分支代表数据。这些反过来又有它们自己的小分支,这些分支一直持续到我们到达代表最内部或最大维度数组的数据的细小叶子为止。

如果您使用自己的名称声明每个级别,则可以看到它的建立。在这里,我重用每个级别的变量以最小化代码:

leaf = 2;
tinyBranch = [leaf, leaf, leaf];
middleBranch = [tinyBranch, tinyBranch, tinyBranch];
bigBranch = [middleBranch, middleBranch, middleBranch];
mainBranch = [bigBranch, bigBranch, bigBranch];

1
这种可视化效果是否会更紧密地代表锯齿状的阵列?
马特·约翰逊

2
@MattJohnson形式上是肯定的,但是此示例也可以解释/可视化多维数组。
M. Mimpen 2014年

4
+1这不仅是一种简洁的可视化方法,而且比许多数组实现的线性解释更接近真相。无论大多数人在这里是否将术语“数组”限制为连续内存,“多维数组 ”无疑是许多语言文献中用于此类排列的术语。
DeveloperInDevelopment

46

尺寸是您想要的尺寸,第四个尺寸不必一定是时间。如果将三个维度视为一个多维数据集,则可以将4个维度视为一行多维数据集。5个维度,多维数据集的网格等。

您还可以拥有3D三维像素集合,第4维是颜色,密度或其他属性。

当您为多维数组分配内存时,它只是简单地为数据类型分配每个维的最大值的乘积。如果每个维度中都有3个数组或10个元素的“多维数据集”,则将分配1,000个元素。如果将第4维中的10个元素组成一个4d数组,计算机将只分配10,000。将其最多拉伸5个尺寸,它将分配100,000。

计算机并不关心每个维度代表什么的含义。要选择单点在元素列表中的位置,只需选择一个存储地址即可。


26

想象一下在某种新的医疗设备上进行研发的过程,这些设备是您沿着患者手臂放置的一系列传感器。您有7名志愿者排队进行测试。每个传感器报告低频,中频和高频读数,每100ms读取一次,持续一分钟左右。

如何将所有这些数据存储在内存中以进行分析和绘图?

显然是一个数组。看起来像这样(使用伪造的通用伪代码):

npatients = 7
nsensors = 4     // number of sensors on an arm
nchannels = 3
nsamples = 60.0 / 0.1
sensordata = Array[ npatients, nsensors, 2, nchannels, nsamples ]

那是一个五维数组,没有什么棘手,神秘或困惑的地方。没有理由尝试将其与5维欧几里德空间相关联。为了获得任何一个数据值,我们使用如下表达式

x = sensordata[6, 5, 1, 2, 338)

就像查询关系数据库一样,在该数据库中您具有每个数据值的记录,其中五列包含患者ID,传感器ID等,以及一列包含该值的列。要获取一个数据点,请在WHERE中使用五个术语:从SensorData WHERE中选择值(病人ID = 6)和(传感器ID = 5)和(arm =“ left”)和(channel =“ midfreq”)和(sampleindex = 338 )。

具有五列或更多列的数据库表没有什么神秘之处,对吗?

(尽管在现实生活中,我使用的是基于1的索引,但是基于0的索引更为常见。)

请注意,由于对臂数进行了硬编码,我是一个坏男孩。如果我有资金研究章鱼上的这些传感器,那我就有麻烦了!


3
+1出色的示例表明尺寸可以是您需要的任何数据。
Mike

20

数组只是连续内存的一个块。内存寻址是一维的,您可以前进或后退。因此,假设您有一个包含5个元素的数组,则将保留5个存储块。如果您有一个二维数组,每个维度中包含5个元素,则将保留25个存储块。


5
是的,在向数组中添加更多维度时,请记住这一点。内存使用情况可能并不简单。
davidhaskins 2014年

18

...或者我会在MathSO上问...

好吧,事实上,数学家永远不会(或者至少通常不会)将第四次元与任何时间联系在一起。他们也不会将前三个与任何空间关联起来:数学家只是定义为通常是向量空间的抽象属性(通常将其概括为歧管甚至度量空间)。这个抽象的定义并不关心我们碰巧要移动的物理空间有多少个维度。尺寸的概念适用于什至与物理空间都不相似的空间。实际上,数学家(甚至是物理学家)经常使用无穷维 空间,例如量子力学的希尔伯特空间。

澄清了这一点,让我们来谈谈数组–您不需要了解向量空间,因为这里的抽象定义实际上要简单得多。

一个(0 × 1 × 2 ×...× Ñ -1)尺寸阵列(即维数的Ñ)是一个简单的集合01 ⋅...⋅ Ñ -1号(或任何类型的对象填充数组)。与该长度的一维数组的唯一区别是,您有一种特别有用的方法来分别索引维,即

= Ñ -1 + Ñ -1 ⋅(Ñ -2 + Ñ -1 ⋅(... 2 ⋅(1 + 10)...))


需要明确的是,您只需要一个包含3个元素的数组来描述3个维度,而N个元素数组则描述N个维度。但是,详细说明每个向量是一个不同的故事。通常,这是通过显示图像来完成的(imshow在Python中)-它可以显示两个空间尺寸以及第三个颜色尺寸。
斯科特

@斯科特:我同意“数组的维数”的概念是不幸的,因为这意味着与空间维数无关的东西,您可以通过数组表示向量。(但是我也认为,首先用普通的抽象数组表示向量不是一个好主意。)一个更好的名字可能是数组的,类似于张量
大约

13

在编程中,数组很容易实现,但也许不容易理解。

通常,每个级别的数组都意味着要具有内容n折叠。那意味着

  • int x[4]是4个块,每个块包含一个int
  • int x[5][4]是5个块,每个块包含一个int[4]
  • int x[3][5][4]是3个块,每个块包含一个int[5][4]
  • int x[2][3][5][4]有2个块,每个块包含一个int[3][5][4]

您如何指称它们取决于您,但是为了更好地理解,您会遇到类似

  • COLUMN 最后一个
  • ROW 对于倒数第二个
  • PAGE 倒数第三

直到这里,我在某处阅读。为了留在这里,我们还可以定义

  • BOOK 倒数第四
  • 可能SHELF倒数第五。(或者,如果您愿意,SHELFROW我们可以继续。)

就是说,我从未在“野生动物”中看到超过4个或5个维的阵列。

这样,您可以将int x[6][2][3][5][4]6个“书架” 定义为一个集合,每个书架有2本书,每本书有3页,每本书有5行,每行有4列。


13

将一维数组想像成一个抽屉柜:

五斗柜

每个抽屉都是数组的索引。您可以在每个抽屉中放入所需的任何物品,出于多种目的,每个抽屉将只包含一个项目(即一维数组)。

这个抽屉虽然很神奇,所以不受物理空间的限制。这意味着您可以再放一个抽屉在第一个抽屉每个抽屉中柜。然后,抽屉的内箱可以容纳任何您想要的东西。那是一个二维数组。

因此,您可以说诸如“打开第一个抽屉的顶部抽屉,将抽屉从该抽屉中取出,然后打开第二个抽屉的底部抽屉”之类的话。就像访问2D数组的索引一样:myArray [0] [3];

当然,最外面的抽屉柜内部的抽屉柜本身也可以包含抽屉柜。那是一个三维数组。

因此,您的问题是:什么是四维数组?当然是五斗橱五斗橱五斗橱!

一直都是抽屉。


4
伙计们,这是五斗橱。
Thomas Eding

8
在最后一个抽屉里?海龟
凯文·沃克曼

有点学究。给定每个抽屉中有3个抽屉(基于图片),而不是4,并且您使用的是基数0,则底部抽屉将是2而不是3。因此,myArray[0][3]它不是myArray[0][2]。但否则很好的解释。
Tom Heard 2014年

@TomHeard第一个抽屉柜有3个抽屉,但是第一个抽屉内的抽屉柜有4个抽屉。!:p
Kevin Workman 2014年

1
哦,那很好。= D
Tom Heard 2014年

5

这个问题的大部分方面都已经考虑过了,但是如果您考虑维度的性质,我认为这会有所帮助。并非所有尺寸都是空间尺寸。维度是度量的上下文。这里有些例子:

  • 频率-颜色或音高
  • 弥撒
  • 颜色(上夸克,下夸克,奇怪夸克,迷住夸克等)
  • 旋转方向
  • 角度
  • 响度
  • 辣度

“第四”维仅是第四维,因为存在三个空间维。时空变大了,因为它们变大了。您的脸非常多。但是,如果您进行测量,那么任何可量化的,可测量的质量都可以成为一个维度。

例如,胸罩具有三个尺寸:杯子尺寸,胸部尺寸和插页式尺寸(我不知道你们的女孩叫什么,但我指的是杯子之间的距离)。


1
“并非所有维度都是空间上的。” 对于数组,所有维度均为空间。
Rhymoid

2
@Rhymoid:对于数组,在我们思考空间的方式中,没有任何维度固有地是空间的。:P我们定义它们来表示我们想要的任何东西。
cHao 2014年

@cHao也许,如果您查看它们存储的数据的语义。但是在事物的表示/语法/实现方面,所有数组维本质上都是空间的。使用数组作为算法的一部分时,实际上这是您所依赖的。
Rhymoid

@Rhymoid:这是导致最初提出此问题的相同思考过程。可枚举的维度不会使其成为空间。在实现方面,没有空间。仅存在内存,并且就程序所知/所见/关心而言,内存是一维的。
cHao 2014年

@cHao:在实现上有空间,因为有时间。术语“空间泄漏”(作为在Haskell社区中发现的“内存泄漏”的替代)不是巧合。记忆被描述为一维的事实是BCPL的传承。
Rhymoid

4

在物理学中,我们假设每个空间维度都是无限的,这使得为新维度寻找空间非常困难。

处理有限数组时,很容易找到空间。

想象一下一张上面印有网格的纸;您可以在网格的每个单元格中写入一些信息。那是一个二维数组:行和列。

将其中几张纸放在一个文件夹中;那是3D数组:页面,行和列。

将其中几个文件夹放在文件框中。4D数组:文件夹,页面,行,列。

在木板上的矩形网格中排列框。6D数组:箱行,箱列,文件夹,页面,行,列。

在这些顶部堆叠更多的箱子网格。7D数组:盒深,盒行,盒列,文件夹,页面,行,列。

开始将托盘塞入装运容器:9D阵列。(假设每个堆栈的高度与容器的内部高度相同,那么在这里您只能再获得2个尺寸。)

在集装箱船的甲板上堆放集装箱:12D阵列。

您的集装箱船舰队现在是一个13D阵列。


“我们假设每个空间维都是无限的”,实际上,无限并不是最大的问题,连续是“真实”的问题(即,无限多个,并且需要同胚映射,因此它在物理上有意义)。
大约

3

在笛卡尔坐标系中,x和y轴在平面上。您可以将平面上的任何数字表示为(x,y)。

在三个“空间”(也称为立方体)中,可以具有x,y和z轴。您可以将多维数据集的任何元素表示为(x,y,z)。

在多元空间中,可以具有x,y,z和w轴(其中w轴是“虚构的”)。您可以将该空间的任何元素表示为(x,y,z,w)。

空间中的所有这些点都由矢量表示。在四空间中,您可以有两个向量,其中v1 =(x1,y1,z1,w1),v2 =(x2,y2,z2,w2)。然后,您可以像对数字一样操作这些向量。例如,两个向量v1 + v2之和为(x1,y1,z1,w1)+(x2,y2,z2,w2)。然后,您将这些向量与数字一样逐项相加,得到:(x1 + x2,y1 + y2,z1 + z2,w1 + w2)。

您的程序将使用适当的数组定义向量,然后以适当的顺序对其进行算术运算。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.