【问题标题】:KDB: apply dyadic function across two listsKDB:在两个列表中应用二元函数
【发布时间】:2026-01-09 15:25:21
【问题描述】:

考虑一个生成表格的函数F[x;y]。我也有两个清单; xList:[x1;x2;x3]yList:[y1;y2;y3]。对F[x1;y1],F[x1;y2],F[x1;y3],F[x2;y1],..., 进行简单的逗号连接从而生成一张大表的最佳方法是什么?

【问题讨论】:

    标签: function kdb


    【解决方案1】:

    你已经要求你的参数列表的叉积,所以正确的答案是

    raze F ./: xList cross yList
    

    【讨论】:

      【解决方案2】:

      根据您在做什么,您可能希望让您的函数对 x 的整个列表和 y 的整个列表进行操作并返回一个表,而不是对每一对然后返回一个表列表必须被夷为平地。性能影响可能相当大,例如见下文

      q)g:{x?y} //your core operation
      q)//this takes each pair of x,y, performs an operation and returns a table for each 
      q)//which must then be flattened with raze
      q)fm:{flip `x`y`res!(x;y; enlist g[x;y])}  
      q)//this takes all x, y at once and returns one table
      q)f:{flip `x`y`res!(x;y;g'[x;y])} 
      q)//let's set a seed to compare answers
      q)\S 1
      q)\ts do[10000;rm:raze fm'[x;y]]
      76 2400j
      q)\S 1
      q)\ts do[10000;r:f[x;y]]
      22 2176j
      q)rm~r
      1b
      

      【讨论】:

        【解决方案3】:

        设置我们的示例

        q)f:{([] total:enlist x+y; x:enlist x; y:enlist y)}
        q)x:1 2 3
        q)y:4 5 6
        

        演示 F[x1;y1]

        q)f[1;4]
        total x y
        ---------
        5     1 4
        q)f[2;5]
        total x y
        ---------
        7     2 5
        

        将多价应用运算符与 each' 一起应用于每对参数。

        q)raze .'[f;flip (x;y)]
        total x y
        ---------
        5     1 4
        7     2 5
        9     3 6
        

        【讨论】:

          【解决方案4】:

          使用each-both 实现它的另一种方法:

          x: 1 2 3
          y: 4 5 6
          f:{x+y}
          f2:{ a:flip x cross y ; f'[a 0;a 1] }
          
          f2[x;y]
          5j, 6j, 7j, 6j, 7j, 8j, 7j, 8j, 9j
          

          【讨论】: