Поэлементное умножение массивов в 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

Как это:

Array.map2 (*) xs ys

Что-то вроде

[| for i in 0 .. array_1.Length - 1 ->
    array_1.[i] * array_2.[i] |]

должно сработать.

Другие вопросы по тегам