Рассмотрим функцию F[x;y]
, которая создает таблицу. У меня также есть два списка; xList:[x1;x2;x3]
и yList:[y1;y2;y3]
. Каков наилучший способ сделать простое соединение запятой F[x1;y1],F[x1;y2],F[x1;y3],F[x2;y1],...,
, создав тем самым одну большую таблицу?
KDB: применить диадическую функцию к двум спискам
Ответы (4)
Вы запросили перекрестное произведение ваших списков аргументов, поэтому правильный ответ
raze F ./: xList cross yList
person
mollmerx
schedule
23.04.2014
В зависимости от того, что вы делаете, вы можете захотеть, чтобы ваша функция работала со всем списком 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
person
JPC
schedule
23.04.2014
Настройте наш пример
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
Используйте многовалентный оператор применения вместе с каждым' для применения к каждой паре аргументов.
q)raze .'[f;flip (x;y)]
total x y
---------
5 1 4
7 2 5
9 3 6
person
Ryan Hamilton
schedule
23.04.2014
Другой способ добиться этого с помощью 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
person
nyi
schedule
05.07.2018