2013-04-04 57 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個不同的操作,它恰好是@運算符超載與許多含義(這兩個是其中之一)