Как вернуть кросс-произведение двоичной функции в KDB - PullRequest
0 голосов
/ 10 декабря 2018

Я хотел бы изучить лучший способ применения бинарной функции, которая выполняет итерацию по каждому элементу двух аргументов.Давайте упростим вопрос, используя приведенную ниже функцию в качестве примера:

func:{x+y}
a:til 10
q)a
0 1 2 3 4 5 6 7 8 9
b:a
q)b:a
q)b
0 1 2 3 4 5 6 7 8 9

Что я получу, так это перекрестное производство, так что каждый элемент аргумента будет пересекать друг друга и применять функцию.Мой ожидаемый результат -

0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11 124 5 6 7 8 9 10 11 12 13 5 6 7 8 9 10 11 12 13 14 6 7 8 9 10 11 12 13 14 15 7 8 9 10 11 12 13 14 15 16 8 9 10 11 12 13 14 15 16 179 10 11 12 13 14 15 16 17 18

Мое текущее решение сначала пересекает список аргументов:

(func/) each (a cross b)

Интересно, есть ли лучший способ сделать это?простое использование func'[a;b] приведет к парному результату, а не к тому, что я хочу.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вам не нужно крестик для этого только каждый справа или слева.Поскольку «+» является векторной функцией, вы можете просто перебрать один список и использовать другой список в качестве полного вектора.

 q) a+/:b
0 голосов
/ 10 декабря 2018

Следующее должно быть тем, что вы ищете:

a +/:\: b

То же самое может применяться и для других определенных функций, например:

a {x mod y}/:\: b
...