2013-04-04 1 views
2

Le @ operator renvoie les éléments indexés par ses paramètres au premier niveau.Opérateur KDB '@'

Comment expliqueriez-vous la dernière ligne dans les exemples de référence, en anglais:

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)) 

Je ne comprends pas l'une des valeurs renvoyées par la dernière utilisation @.

Répondre

4

Pour la structure de données d, prendre ces éléments en indices 1 1 1 et ajouter 3. Quelle puisque vous faites référence au même index trois fois, signifie ajouter 9. Pause en étapes:

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) 

La raison pour laquelle la référence au même index ajoute 9 est due à la gestion de la mémoire de kdb: http://www.timestored.com/kdb-guides/memory-management#reference_counting Le même vecteur sous-jacent est référencé dans chaque cas, ce qui peut être un peu inattendu.

+0

Pourquoi l'appel à @ [d; 1] renvoie seulement l'élément indexé tandis que @ [d ; 1; +; 3] renvoie tous les éléments d? –

3

Kubrick @ Robert

pour votre deuxième question

Pourquoi l'appel à @[d;1] ne retourne que le élément indexé en @[d;1;+;3] retourne tous les éléments d?

@[d;1] renvoie uniquement la liste à 1 car elle s'indexe effectivement dans la liste. Il est équivalent à faire d[1] (ou [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 

faisant quant à lui @[d;1;+;3] retournera toute la liste, car il est l'application fonctionnelle d'ajouter 3 lors de l'indexation en 1, il ne correspond pas à ce que vous faites avec @[d;1] , ils sont 2 opérations différentes, il arrive juste que l'opérateur @ est surchargé avec beaucoup de significations (ces 2 étant l'un d'eux)