🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# F.8\. cube 这个模块为了表示多维立方体实现了数据类型`cube`。 ## F.8.1\. 语法 [Table F-1](#calibre_link-2159)为`cube`类型显示有效外部表示。 `_x_`, `_y_`等表示浮点数。 **Table F-1\. Cube外部表示** | `_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`函数自动交换值。 忽略空格,因此`[(``_x_`),(`_y_`)]和 `[ (` `_x_` ), ( `_y_` ) ]是一样的。 ## F.8.2\. 精确度 值内部被存储为64位浮点数。 这意味着超过16位有效数字将被截断。 ## F.8.3\. 用法 `cube`模块包含`cube`值的GiST索引操作类。 通过GiST操作符类支持的操作符显示在[Table F-2](#calibre_link-2160)中。 **Table F-2\. Cube GiST 运算符** | 运算符 | 描述 | | --- | --- | | `a = b` | 立方体a和b是相同的。 | | `a && b` | 立方体a和b重叠 | | `a @> b` | 立方体a包含立方体b。 | | `a <@ b` | 立方体a被包含在立方体b中。 | (PostgreSQL 8.2之前, 包含操作符`@>`和`<@`分别称为 `@`和`~`。 这些名字仍然可用,但是被否决并且最终被废弃。 请注意旧的名称从先前遵循核心几何数据类型的规定中被反转!) 提供标准B树运算符,比如 | 运算符 | 描述 | | --- | --- | | `[a, b] < [c, d]` | 小于 | | `[a, b] > [c, d]` | 大于 | 这些操作符没有任何实际目的意义但排序。 这些操作符首先比较(a)和(c),如果是相等的, 那么比较(b)和(d)。 导致在某些情况下合理排序, 如果你想使用这种类型的ORDER BY,那么它是有用的。 [Table F-3](#calibre_link-2161)显示可用函数。 **Table F-3\. Cube函数** | `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('{1,2}'::float[], '{3,4}'::float[]) == '(1,2),(3,4)'` | | `cube(cube, float8)返回cube` | 通过添加一个维度到新坐标两个部分相同值的已存在立方体来构建一个新的立方体 这对于逐渐地从计算值建构立方体是有用的。 `cube('(1)',2) == '(1,2),(1,2)'` | | `cube(cube, float8, float8)返回cube` | 通过添加一个维度到已存在立方体上构建一个新的立方体。 这对于逐渐地从计算值建构立方体是有用的。 `cube('(1,2)',3,4) == '(1,3),(2,4)'` | | `cube_dim(cube)返回int` | 返回立方体的维数 | | `cube_ll_coord(cube, int)返回double` | 返回立方体左下角的第n个坐标值 | | `cube_ur_coord(cube, int)返回double` | 返回立方体右上角的第n个坐标值 | | `cube_is_point(cube)返回bool` | 如果cube是一点,那么返回真。也就是说,两个定义的角是一样的。 | | `cube_distance(cube, cube)返回double` | 返回两个立方体之间的距离。 如果两个立方体是点,那么这是一个正常距离函数。 | | `cube_subset(cube, int[])返回cube` | 从一个已经存在立方体构建新的立方体,使用来自数组的维度索引列表。 可以用于查找单维的LL和UR坐标,比如, `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(cube c, double r, int n)返回cube` | 通过至少n维的指定半径增加立方体大小。 如果半径是负数立方体反而缩减。 在点周围搜索临近点创建边界区域是很有用的。 所有定义维数通过半径r来改变。 LL坐标减少了r,UR坐标增加了r。 如果LL坐标增加到可以大于相应的UR坐标(当r < 0时,这可以发生) 比起两个坐标系被设置为平均来说, 如果n大于定义维度数,并且立方体正被增加(r >= 0), 然后使用0作为额外坐标基础。 | ## F.8.4\. 缺省 我相信这个联合: ``` select cube_union('(0,5,2),(2,3,1)', '0'); cube_union ------------------- (0, 0, 0),(2, 5, 2) (1 row) ``` 不违背常识,也不违背交集 ``` select cube_inter('(0,-1),(1,1)', '(-2),(2)'); cube_inter ------------- (0, 0),(1, 0) (1 row) ``` 在不同的维度立方体的所有二进制运算中,我认为降低笛卡尔积投影维数,比如, 在字符串表示中忽略坐标的地方归零。上面例子等同于: ``` cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)'); cube_inter('(0,-1),(1,1)','(-2,0),(2,0)'); ``` 下面的包含谓词使用point语法, 而实际上第二个参数通过box内部表示。 这个语法没必要定义单独的point类型 以及(box,point)谓词函数。 ``` select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row) ``` ## F.8.5\. 注意 对于用法实例,参阅回归测试`sql/cube.sql`。 为了使人们突破该事物更加难, 在立方体维度数量上有100的限制。 如果你需要大一些的, 可以在`cubedata.h`中设置。 ## F.8.6\. 赞扬 原作者:Gene Selkov, Jr. `<[selkovjr@mcs.anl.gov](mailto:selkovjr@mcs.anl.gov)>`, 数学和计算机科学系,Argonne国家实验室。 首先感谢 Prof. Joe Hellerstein([http://db.cs.berkeley.edu/jmh/](http://db.cs.berkeley.edu/jmh/)) 阐明GiST ([http://gist.cs.berkeley.edu/](http://gist.cs.berkeley.edu/))的要点, 和他以前的学生Andy Dong ([http://best.me.berkeley.edu/~adong/](http://best.me.berkeley.edu/~adong/)), 比如书面说明例子,[http://best.berkeley.edu/~adong/rtree/index.html](http://best.berkeley.edu/~adong/rtree/index.html)。 我还要感谢所有现在的和以前的Postgres开发人员,使我可以创造我的世界并且在这个领域生存。 并且我还想要感谢Argonne Lab和能源 U.S. Department对我的数据库研究多年的忠实支持。 这个包较小更新是由Bruno Wolff III `<[bruno@wolff.to](mailto:bruno@wolff.to)>`在2002年八月/九月完成的。 这些包含从单精度到双精度改变精度以及添加一些新的函数。 额外更新是由Joshua Reich `<[josh@root.net](mailto:josh@root.net)>`在2006年7月进行的。 这些包含`cube(float8[], float8[])`并且 使用V1调用协议而不是过时的V0协议来清理代码。