Поэлементное умножение массивов в F#
Есть ли простой способ умножить элементы массива в F#?
Так, например, я хочу вычислить среднее значение по выборкам, я бы умножил наблюдаемые значения на частоту, а затем разделил на номера выборок.
let array_1 = [|1;32;9;5;6|];;
let denominator = Array.sum(array_1);;
denominator;;
let array_2 = [|1;2;3;4;5|];;
let productArray = [| for x in array_1 do
for y in array_2 do
yield x*y |];;
productArray;;
let numerator = Array.sum(productArray);;
numerator/denominator;;
К сожалению, это приводит к массиву продуктов, например:
val it : int [] =
[|1; 2; 3; 4; 5; 32; 64; 96; 128; 160; 9; 18; 27; 36; 45; 5; 10; 15; 20; 25;
6; 12; 18; 24; 30|]
Который является продуктом всего со всем, тогда как я после точечного продукта (x.[I]*y.[I] для каждого i).
К сожалению, добавление переменной i и индекса в циклы for, похоже, не работает.
Какое лучшее решение использовать здесь?
3 ответа
Решение
Array.zip array_1 array_2
|> Array.map (fun (x,y) -> x * y)
Как отмечается в комментарии, вы также можете использовать Array.map2
:
Array.map2 (*) array_1 array_2
Что-то вроде
[| for i in 0 .. array_1.Length - 1 ->
array_1.[i] * array_2.[i] |]
должно сработать.