# F.9.立方体

F.9.1.语法F.9.2.精确F.9.3.用法F.9.4.默认值F.9.5.笔记F.9.6.信用

该模块实现了一种数据类型立方体用于表示多维立方体。

该模块被认为是“受信任的”,也就是说,它可以由拥有创造当前数据库的权限。

# F.9.1.语法

表F.2显示了的有效外部表示形式立方体类型*十、,y*等表示浮点数。

表F.2.立方体外部表示

外部语法 意思
*十、* 一维点(或零长度一维区间)
(*十、*) 同上
*x1*,*x2*,...,*xn* n维空间中的一点,内部表示为零体积立方体
(*x1*,*x2*,...,*xn*) 同上
(*十、*),(*y*) 从…开始的一维间隔*十、结束于y*反之亦然;命令无关紧要
[(*x*),(*y*)] Same as above
(*x1*,...,*xn*),(*y1*,...,*yn*) An n-dimensional cube represented by a pair of its diagonally opposite corners
[(*x1*,...,*xn*),(*y1*,...,*yn*)] Same as above

It does not matter which order the opposite corners of a cube are entered in. Thecubefunctions automatically swap values if needed to create a uniform “lower left — upper right” internal representation. When the corners coincide,cubestores only one corner along with an “is point” flag to avoid wasting space.

输入时忽略空白,因此[(*十、*),(*y*)][ ( *十、* ), ( *y* ) ].

# F.9.2.精确性

值在内部存储为64位浮点数。这意味着超过16位有效数字的数字将被截断。

# F.9.3.用法

表F.3显示为类型提供的专用运算符立方体.

表F.3.立方体运算符

操作人员

描述
立方体 && 立方体布尔值

立方体重叠吗?
立方体 @> 立方体布尔值

第一个立方体包含第二个立方体吗?
立方体 <@ 立方体布尔值

第一个立方体包含在第二个立方体中吗?
立方体 -> 整数浮动8

提取*n*-立方体的第四个坐标(从1开始计数)。
立方体 ~> 整数浮动8

提取*n-立方体的第h坐标,按以下方式计数:n* = 2 * k-1表示函数的下界*k-第四维度,n* = 2 * k表示的上限k-第四维度。消极的*n*表示对应正坐标的反数值。该操作员是为KNN GiST支持而设计的。
立方体 <-> 立方体浮动8

计算两个立方体之间的欧几里德距离。
立方体 <#> 立方体浮动8

计算两个立方体之间的出租车(L-1公制)距离。
立方体 <=> 立方体浮动8

计算两个立方体之间的切比雪夫(L-inf度量)距离。

除上述运算符外,中还显示了常用的比较运算符表9.1可用于打字立方体这些操作符首先比较第一个坐标,如果这些坐标相等,则比较第二个坐标,等等。它们的存在主要是为了支持立方体,例如,如果您希望在立方体柱否则,这种排序没有多大实际用途。

这个立方体模块还为立方体价值观A.立方体GiST索引可用于使用=, &&, @><@运营商哪里条款。

此外,一个立方体GiST索引可用于使用度量运算符查找最近邻<->, <#><=>在里面订购人条款。例如,可以通过以下方法有效地找到三维点(0.5,0.5,0.5)的最近邻:

SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;

这个~>运算符也可以以这种方式有效地检索按选定坐标排序的前几个值。例如,要获得按第一个坐标(左下角)升序排列的前几个立方体,可以使用以下查询:

SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;

要获得按右上角第一个坐标降序排列的二维立方体:

SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;

表F.4显示可用的功能。

表F.4.立方体函数

作用

描述

例子
立方体 ( 浮动8 ) → 立方体

使两个坐标相同的一维立方体。

立方体(1)(1)
立方体 ( 浮动8, 浮动8 ) → 立方体

形成一个一维立方体。

立方体(1,2)(1),(2)
立方体 ( 浮动8[] ) → 立方体

使用数组定义的坐标生成零体积立方体。

立方体(数组[1,2,3])(1, 2, 3)
立方体 ( 浮动8[], 浮动8[] ) → 立方体

使用两个数组定义的右上角和左下角坐标创建立方体,这两个数组的长度必须相同。

立方体(数组[1,2],数组[3,4])(1, 2),(3, 4)
立方体 ( 立方体, 浮动8 ) → 立方体

通过在现有多维数据集上添加维度来创建新多维数据集,新坐标的两个端点的值相同。这对于根据计算值逐块构建立方体非常有用。

立方体('(1,2),(3,4)':立方体,5)(1, 2, 5),(3, 4, 5)
立方体 ( 立方体, 浮动8, 浮动8 ) → 立方体

通过向现有多维数据集添加维度来创建新多维数据集。这对于根据计算值逐块构建立方体非常有用。

立方体(‘(1,2)、(3,4)’:立方体,5,6)(1, 2, 5),(3, 4, 6)
立方体尺寸 ( 立方体 ) → 整数

返回多维数据集的维数。

立方体尺寸(‘(1,2)、(3,4)’)2.
cube_ll_coord ( 立方体, 整数 ) → 浮动8

返回*n*-立方体左下角的第个坐标值。

立方体坐标('(1,2),(3,4)'2)2.
cube_ur_coord ( 立方体, 整数 ) → 浮动8

返回*n*-立方体右上角的第个坐标值。

立方体(1,2,3,4,2)4.
立方体是点 ( 立方体 ) → 布尔值

如果立方体是一个点,即两个定义角点相同,则返回true。

立方体是点(立方体(1,1))t
立方距离 ( 立方体, 立方体 ) → 浮动8

返回两个立方体之间的距离。如果两个立方体都是点,这就是正常距离函数。

立方体距离('(1,2',(3,4')2.8284271247461903
立方_子集 ( 立方体, 整数[] ) → 立方体

使用数组中的维度索引列表,从现有多维数据集生成新多维数据集。可用于提取单个标注的端点,或删除标注,或根据需要对其重新排序。

cube_子集(cube('(1,3,5)、(6,7,8)),数组[2])(3),(7)

cube_子集(cube('(1,3,5)、(6,7,8)),数组[3,2,1,1])(5, 3, 1, 1),(8, 7, 6, 6)
多维联合 ( 立方体, 立方体 ) → 立方体

生成两个立方体的并集。

立方_并集(‘(1,2)’,‘(3,4)’)(1, 2),(3, 4)
cube_inter ( 立方体, 立方体 ) → 立方体

生成两个立方体的交点。

立方体(1,2),(3,4)(3, 4),(1, 2)
立方体放大 ( c 立方体, r 双重的, n 整数 ) → 立方体

将立方体的大小增加指定的半径*r至少n尺寸。如果半径为负,立方体将缩小。所有定义的尺寸都会根据半径进行更改r.左下角坐标减少r右上角的坐标增加了r.如果左下坐标增加到大于相应的右上坐标(仅当r\<0)则两个坐标都设置为其平均值。如果n大于定义的维度数,并且立方体正在被放大(r* >0),然后添加额外的尺寸以使*n*总共0用作额外坐标的初始值。此函数用于在点周围创建边界框以搜索附近的点。

立方体(1,2,3,4,0.5,3)(0.5, 1.5, -0.5),(3.5, 4.5, 0.5)

# F.9.4.默认值

我相信这个联盟:

select cube_union('(0,5,2),(2,3,1)', '0');
cube_union
### F.9.5. Notes

 For examples of usage, see the regression test `sql/cube.sql`.

 To make it harder for people to break things, there is a limit of 100 on the number of dimensions of cubes. This is set in `cubedata.h` if you need something bigger.

### F.9.6. Credits

 Original author: Gene Selkov, Jr. `<[selkovjr@mcs.anl.gov](mailto:selkovjr@mcs.anl.gov)>`, Mathematics and Computer Science Division, Argonne National Laboratory.

 My thanks are primarily to Prof. Joe Hellerstein ([https://dsf.berkeley.edu/jmh/](https://dsf.berkeley.edu/jmh/)) for elucidating the gist of the GiST ([http://gist.cs.berkeley.edu/](http://gist.cs.berkeley.edu/)), and to his former student Andy Dong for his example written for Illustra. I am also grateful to all Postgres developers, present and past, for enabling myself to create my own world and live undisturbed in it. And I would like to acknowledge my gratitude to Argonne Lab and to the U.S. Department of Energy for the years of faithful support of my database research.

 Minor updates to this package were made by Bruno Wolff III `<[bruno@wolff.to](mailto:bruno@wolff.to)>` in August/September of 2002. These include changing the precision from single precision to double precision and adding some new functions.

 Additional updates were made by Joshua Reich `<[josh@root.net](mailto:josh@root.net)>` in July 2006. These include `cube(float8[], float8[])` and cleaning up the code to use the V1 call protocol instead of the deprecated V0 protocol.