我们如何在q中使用迭代器将函数列表应用于参数列表的每个列表?

问题描述

在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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...