【问题标题】:KDB '@' operatorKDB '@' 运算符
【发布时间】:2013-04-04 12:08:29
【问题描述】:

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

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

【问题讨论】:

    标签: kdb


    【解决方案1】:

    对于数据结构 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 在每种情况下都引用了相同的基础向量,这可能有点出乎意料。

    【讨论】:

    • 为什么调用@[d;1] 只返回索引元素而@[d;1;+;3] 返回所有d 元素?
    【解决方案2】:

    @罗伯特库布里克

    第二个问题

    为什么调用@[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 个不同的操作,只是这样碰巧@ 运算符重载了许多含义(这两个是其中之一)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2017-03-29
      相关资源
      最近更新 更多