kdbq-为正整数创建2d存储桶



我正在尝试在q 中创建2d存储桶

给定二维网格

5 o---o---o
|   |   |
3 o---o---o
|   |   |
0 o---o---o
0   3   5

网格上的每个节点都定义了正整数的2d桶的边界。例如,中心节点将包含元组(x;y),其中3<=x<53<=y<5。这九个存储桶是从0,...,8索引的。

我试图在q中实现这一点的方法是

bucketidx:{((0 3 5i) cross (0 3 5i)) bin "i"$(first x;last x)}

遍历存储桶:

bucketidx each ((0 3 5i) cross (0 3 5i))
/0j, 1j, 2j, 3j, 4j, 5j, 6j, 7j, 8j

然而,我在bucketidx 6 0上有一个奇怪的行为。我希望它在左上角的节点中

(5<=y) and (x=0)

但是它返回索引CCD_ 7,该索引将是右上节点。我希望清楚我想做什么。

感谢的帮助

这是因为bin行为。

二进制搜索返回x中最后一个项目的索引,该索引<y

https://code.kx.com/q/ref/search/#bin-仓

您的列表是:

q) a:(0 3 5i) cross (0 3 5i)
q) a / (0 0; 0 3;0 5;3 0; 3 3; 3 5;5 0;5 3; 5 5)

您正在使用bin函数在此列表中搜索(6 0(,并且该列表中的最后一项<(6;0(是(5;5(并且该项的索引是8。

q) a bin 6 0 / 8

这就是你得了8分的原因。

我认为"元组与bin"方法不是解决这个问题的正确方法。

你们可以使用类似于以下想法的东西。函数的第一个自变量是X坐标,第二个自变量是Y坐标。

q) node:{b:0 3 5;(b bin x)+3*b bin y}
q) node[0;6] / 6

另一种方法是使用具有排序属性的字典,这使它成为一个step函数。

q)d:`s#0 3 5!0 1 2
q)3 sv' d@(0 3 5i) cross (0 3 5i)
0 1 2 3 4 5 6 7 8
q)3 sv' d@enlist 6 0
,6

最新更新