2013-04-04 120 views
2

@ operator返回由其参数在第一级索引的元素。KDB'@'运算符

你会如何解释在参考实例中的最后一行,英文:

q)d:((1 2 3;4 5 6 7);(8 9;10;11 12);(13 14;15 16 17 18;19 20)) 
q)[email protected] 
(8 9;10;11 12) 
q)[email protected] 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)) 

我不明白,任何由过去的@使用返回的值。

回答

4

对于数据结构d,采取以指数111,并添加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 在每种情况下都引用了相同的底层向量,这可能有点意外。

+0

为什么对@ [d; 1]的调用只返回索引元素,而@ [d ; 1; +; 3]返回所有d元素? – 2013-04-04 13:15:56

3

@Robert库布里克

关于第二个问题

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

@[d;1]只返回1列表,因为它有效地索引到列表中。这相当于做d[1](或[email protected]

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)[email protected] 
8 9 
10 11 12 
q)d[1] 
8 9 
10 11 12 

同时做@[d;1;+;3]将返回整个列表,因为它是加3而进行索引1的功能应用,但并不等同于你与@[d;1]做什么,他们是2个不同的操作,它恰好是@运算符超载与许多含义(这两个是其中之一)