2

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

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

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

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

4

2 回答 2

4

对于数据结构 d,在索引 1 1 1 处获取这些项目并添加 3。由于您引用相同的索引 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 在每种情况下都引用了相同的底层向量,这可能是有点意外。

于 2013-04-04T12:53:01.767 回答
3

@罗伯特库布里克

对于你的第二个问题

为什么调用@[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

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

于 2013-04-11T18:43:14.620 回答