このタイプの問題では、ジェネリック関数を定義するのが理にかなっています。
# Input is assumed to be an array of two numeric arrays of the same length
def pairwise: transpose | map(.[0] * .[1]);
これをさまざまな方法で簡単に使用できるようになりました。
[[1,2],[3,4]] | pairwise
{"a":[1,2], "b":[3,4]} | [.a,.b] | pairwise
{"a":[1,2], "b":[3,4]} | [.[]] | pairwise
これらの場合のそれぞれの結果はもちろん[3,8]
です。
効率
非常に大きな入力の場合、次のことを避ける価値があるかもしれませんtranspose
:
def pairwise:
.[0] as $x | .[1] as $y
| reduce range(0; $x|length) as $i ([]; . + [$x[$i] * $y[$i]]);
通常、ベクトルの場合、内積に関心があります。これは、効率のために、次のように直接定義するのが最適です。
def inner($a; $b):
reduce range(0;$a|length) as $i (0; . + $a[$i]*$b[$i]);