Ответ 1
Здесь одно решение:
let combine weights arrs =
Array.map2 (fun w -> Array.map ((*) w)) weights arrs
|> Array.reduce (Array.map2 (+))
ИЗМЕНИТЬ
Вот некоторые (очень необходимые) объяснения того, как это работает. Логически мы хотим сделать следующее:
- Примените каждый вес к соответствующей строке.
- Добавьте вместе скорректированные по весу строки.
Две строки выше делают именно это.
- Мы используем функцию
Array.map2
для объединения соответствующих весов и строк; способ, которым мы их объединяем, состоит в том, чтобы умножить каждый элемент в строке на вес, который выполняется через внутреннийArray.map
. - Теперь у нас есть массив взвешенных строк и нужно добавить их вместе. Мы можем делать это один шаг за раз, сохраняя текущую сумму, добавляя каждый массив поочередно. То, как мы суммируем два массива поточечно, - это снова использовать
Array.map2
, используя(+)
как функцию для объединения элементов из каждого. Мы помещаем это вArray.reduce
, чтобы применить эту функцию добавления к каждой строке поочередно, начиная с первой строки.
Надеюсь, это разумный подход к проблеме, хотя стиль без надзора, по общему признанию, делает его несколько сложным для подражания. Однако обратите внимание, что это не особенно результативно; вместо того, чтобы создавать новые массивы с каждым приложением map
, map2
и reduce
, будет более эффективным. К сожалению, стандартная библиотека не содержит хороших аналогов этих операций, которые работают на месте. Было бы относительно легко создать такие аналоги, и они могли бы использоваться почти так же, как я сделал здесь.