问题描述
在q / kdb中,我们可以将函数应用于多个参数,如下所示:
f each (1;2;3)
我们还可以将定义的参数应用于函数列表:
flist: (f1:{x+y+z},f2:{x+y-z},f3:{x-y+z}); flist .\: 1 2 3
将这两种方式组合在一起的最有效方法是将列表中的每个函数作为参数应用到列表中的每个值。例如,要将3个一元函数f1,f2和f3应用于包含值1、2和3(产生9个调用)的列表。
对此有任何帮助,深表感谢!
解决方法
您可以使用eachboth(')运算符:
q)f1:1+;f2:2+;f3:3+
q)(f1;f2;f3) @' 10 20 30
11 22 33
,或者对于多参数函数,
q)g1:+;g2:-;g3:*
q)(g1;g2;g3) .' (2 1;3 2;2 2)
3 1 4
如果要将每个函数应用于每个值,则需要首先形成叉积:
q)(@/)each(f1;f2;f3) cross 10 20 30
11 21 31 12 22 32 13 23 33
,
可以将一元apply-at @
(因为您要处理一元函数)与左和右的组合使用。例如:
q)({x+1};{neg x};{x*x}) @\:/: (1 2 3)
2 -1 1
3 -2 4
4 -3 9