Предположим, у нас есть пара входных массивов или список кортежей (ключ, значение), если хотите. Каков элегантный и эффективный способ объединения значений, индексы которых попадают в определенный интервал? Например, если размер интервала (или «бина») равен 10, тогда будут объединены значения всех индексов из 0 < x <= 10
, а также значения индексов из 10 < x <= 20
и так далее. Я хочу:
let interval = 10
let index = [| 6; 12; 18; 24 |]
let value = [| a; b; c; d |]
result = [| a; b + c; d |]
Самый грубый способ сделать это — использовать множество операторов if, else if (диапазон индекса имеет определенный верхний предел). я сблизился с
for i = 0 to index.Length do
result.[Math.Floor(index.[i]/10] += value.[Math.Floor(index.[i]/10]
но это делает 0 <= x < 10
, а не 0 < x <= 10
.
Я также попытался предположить, что индексы упорядочены и равномерно распределены, с
for i = 1 : ( index.Length - 1 ) / valuesPerBin
valueRange = ((i-1)*valuesPerBin + 1) : i*valuesPerBin )
result(i) = sum(value(valueRange))
что хорошо, но, очевидно, ломается, если есть нецелое число значений в ячейке.
Как лучше всего это сделать на F#? Есть ли имя или существующая функция для того, что я пытаюсь сделать?