KDB'@'运营商

时间:2013-04-04 12:08:29

标签: kdb

@ operator返回第一级参数索引的元素。

您如何解释参考示例中的最后一行,用英语:

q)d:((1 2 3;4 5 6 7);(8 9;10;11 12);(13 14;15 16 17 18;19 20))
q)d@1
(8 9;10;11 12)
q)d@1 2 / selects 2 items at the top level
((8 9;10;11 12);(13 14;15 16 17 18;19 20))

q)@[d;1 1 1;+;3]
((1 2 3;4 5 6 7);(17 18;19;20 21);(13 14;15 16 17 18;19 20))

我不理解上次@用法返回的任何值。

2 个答案:

答案 0 :(得分:4)

对于数据结构d,在索引1 1 1处取这些项并添加3.由于您引用相同的索引三次,意味着添加9.将其分解为步骤:

q)d
(1 2 3;4 5 6 7)
(8 9;10;11 12)
(13 14;15 16 17 18;19 20)

/ use indexing to check which elements we are referring to
q)@[d;1]
8 9
10
11 12

/ adding 3 to a single index
q)@[d;1;+;3]
(1 2 3;4 5 6 7)
(11 12;13;14 15)
(13 14;15 16 17 18;19 20)

/ refer to same index multiple times
q)@[d;1 1 1;+;3]
(1 2 3;4 5 6 7)
(17 18;19;20 21)
(13 14;15 16 17 18;19 20)

引用同一索引增加9的原因是由于kdb的内存管理:http://www.timestored.com/kdb-guides/memory-management#reference_counting 在每种情况下都会引用相同的底层向量,这可能有点出乎意料。

答案 1 :(得分:3)

@Robert Kubrick

第二个问题

为什么在@[d;1]返回所有@[d;1;+;3]元素时,对d的调用仅返回索引元素?

@[d;1]仅返回列表1,因为它有效地索引到列表中。它相当于执行d[1](或d@1

 q )d:((1 2 3; 4 5 6 7);(8 9; 10 11 12); ( 13 14; 15 16 17 18; 19 20))
 q)d
 (1 2 3;4 5 6 7)
 (8 9;10 11 12)
 (13 14;15 16 17 18;19 20)
q)@[d;1]
 8 9
 10 11 12
q)d@1
8 9
10 11 12
q)d[1]
8 9
10 11 12

同时执行@[d;1;+;3]将返回整个列表,因为它是在索引为1时添加3的功能应用程序,它不等同于您使用@[d;1]执行的操作,它们是2个不同的操作,恰好是@运算符超载了很多含义(这2个是其中之一)