cube

cube

这个模块实现了一种数据类型cube来表示多维立方体。

语法

表 F.2展示了cube类型有效的外部表示。x、*y*等表示浮点数。

立方体外部表示

外部语法 含义
*x* 一个一维点(或者长度为零的一维区间)
(*x*) 同上
*x1*,*x2*,...,*xn* n-维空间中的一个点,内部表示为一个零容积立方体
(*x1*,*x2*,...,*xn*) 同上
(*x*),(*y*) 开始于x并且结束于y的一个一维区间,反之亦然。顺序并不重要
[(*x*),(*y*)] 同上
(*x1*,...,*xn*),(*y1*,...,*yn*) 一个 n-维立方体,用它的对角顶点对表示
[(*x1*,...,*xn*),(*y1*,...,*yn*)] 同上

一个立方体的对角录入的顺序无关紧要。如果需要创建一种统一的“左下 — 右上”的内部表示,cube函数会自动地交换值。当角重合时,cube只存储一个角和一个“is point”标志,这样避免浪费空间。

输入中的空白空间会被忽略,因此[(*x*),(*y*)][ ( *x* ), ( *y* ) ]相同。

精度

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

用法

表 F.3展示了为类型cube提供的操作符。

表 F.3. 立方体操作符

操作符 结果 描述
a = b boolean 立方体 a 和 b 相同。
a && b boolean 立方体 a 和 b 重叠。
a @> b boolean 立方体 a 包含 立方体 b。
a <@ b boolean 立方体 a 被包含在立方体 b 中。
a < b boolean 立方体 a 小于立方体 b。
a <= b boolean 立方体 a 小于或者等于立方体 b。
a > b boolean 立方体 a 大于立方体 b。
a >= b boolean 立方体 a 大于或者等于立方体 b。
a <> b boolean 立方体 a 不等于立方体 b。
a -> n float8 得到立方体的第n个坐标(从 1 开始数)。
a ~> n float8 以下列方式获取多维数据集的第n个坐标: n = 2 * k - 1表示第k维度的下限, n = 2 * k表示第k维度的上限。 负的n表示相应正坐标的倒数值。此运算符专为KNN-GiST支持而设计。
a <-> b float8 a 和 b 之间的欧氏距离。
a <#> b float8 a 和 b 之间的直线距离(taxicab 距离,L1 度量)。
a <=> b float8 a 和 b 之间的切比雪夫(L-inf 度量)距离。

标量排序操作符(<>=等)除了用来排序之外没有什么实际用途。这些操作符首先比较第一个坐标,如果它们相等再比较第二个坐标等等。它们主要为支持cube的 b-树索引操作符类而存在,这类操作符对支持cube列上的 UNIQUE 约束等很有用。

cube模块也为cube值提供了一个 GiST 索引操作符类。cube GiST 索引可以被用于在WHERE子句中通过=&&@>以及<@操作符来搜索值。

此外,cube GiST 索引可以被用在ORDER BY子句中通过度量操作符<-><#><=>来查找最近邻。例如, 3-D 点(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;

以及得到通过右上角第一个坐标降序排列后的 2-D 立方体:

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

表 F.4展示了可用的函数。

表 F.4. 立方体函数

函数 结果 描述 例子
cube(float8) cube 制造一个一维立方体,坐标都是相同的。 cube(1) == '(1)'
cube(float8, float8) cube 制造一个一维立方体。 cube(1,2) == '(1),(2)'
cube(float8[]) cube 使用数组定义的坐标制造一个零容积的立方体。 cube(ARRAY[1,2]) == '(1,2)'
cube(float8[], float8[]) cube 用由两个数组定义的右上和左下坐标制造一个立方体,两个数组必须等长。 cube(ARRAY[1,2], ARRAY[3,4]) == '(1,2),(3,4)'
cube(cube, float8) cube 在一个现有的立方体上增加一维来制造一个新立方体,对新坐标的各个端点都采用相同的值。这可以用于从计算得到的值逐渐地构建立方体。 cube('(1,2),(3,4)'::cube, 5) == '(1,2,5),(3,4,5)'
cube(cube, float8, float8) cube 在一个现有的立方体上增加一维来制造一个新立方体。这可以用于从计算得到的值逐渐地构建立方体。 cube('(1,2),(3,4)'::cube, 5, 6) == '(1,2,5),(3,4,6)'
cube_dim(cube) integer 返回该立方体的维数 cube_dim('(1,2),(3,4)') == '2'
cube_ll_coord(cube, integer) float8 返回一个立方体的左下角的第 n个坐标值 cube_ll_coord('(1,2),(3,4)', 2) == '2'
cube_ur_coord(cube, integer) float8 返回一个立方体的右上角的第n个坐标值 cube_ur_coord('(1,2),(3,4)', 2) == '4'
cube_is_point(cube) boolean 如果一个立方体是一个点则返回真,也就是两个定义点相同。
cube_distance(cube, cube) float8 返回两个立方体之间的距离。如果两个都是点,这就是普通距离函数。
cube_subset(cube, integer[]) cube 从一个现有的立方体制造一个新立方体,使用来自于一个数组的维索引列表。它可以被用来抽取一个单一维度的端点,或者它可以被用来去除维度,或者按照需要对它们重新排序。 cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) == '(3),(7)' cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) == '(5,3,1,1),(8,7,6,6)'
cube_union(cube, cube) cube 产生两个立方体的并
cube_inter(cube, cube) cube 产生两个立方体的交
cube_enlarge(c cube, r double, n integer) cube 用一个指定的半径r在至少n个维度上增加立方体的尺寸。如果该半径是负值,则该立方体会收缩。这有助于围绕一个点创建一个外包盒来搜索附近点。所有已定义的维度都会按照半径r被改变。左下坐标按照r被减小并且右上坐标按照r被增加。如果一个左下坐标被增加得超过对应的右上坐标(这只会发生在r< 0 时),则两个坐标会被设置为它们的均值。如果*n大于已定义的维度数并且该立方体被增加(*r >= 0), 则额外的维度会被加入以让维度数达到n,对于额外的坐标将使用 0 作为初始值。这个函数可用来创建围绕一个点的外包盒以搜索临近点。 cube_enlarge('(1,2),(3,4)', 0.5, 3) == '(0.5,1.5,-0.5),(3.5,4.5,0.5)'