Function KDB:跨两个列表应用并矢函数

Function KDB:跨两个列表应用并矢函数,function,kdb,Function,Kdb,考虑一个生成表的函数F[x;y]。我也有两份清单xList:[x1;x2;x3]和yList:[y1;y2;y3]。对F[x1;y1]、F[x1;y2]、F[x1;y3]、F[x2;y1]、…,进行简单的逗号连接从而生成一个大表的最佳方法是什么?设置我们的示例 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

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

设置我们的示例

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
将多价apply运算符与each'一起使用,以应用于每对参数

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

根据您正在执行的操作,您可能希望让函数对整个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

您已要求参数列表的叉积,因此正确答案为

raze F ./: xList cross yList

另一种方法是同时使用

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