У меня есть 2 массива Double одинаковой длины. Массив a заполнен некоторыми данными, массив b должен быть вычислен.
Каждый элемент массива b равен соответствующему значению из массива a плюс взвешенная сумма всех предшествующих элементов в массиве b.
Взвешенная сумма вычисляется путем сложения всех этих элементов, каждый из которых умножается на коэффициент, равный его расстоянию от текущего элемента, который мы вычисляем, деленному на количество элементов в предыдущем подмножестве.
Для реализации этого цикла I через все предыдущее подмножество для каждого рассчитываемого мной элемента.
Можно ли это оптимизировать? У меня недостаточно математических навыков, но я подозреваю, что могу использовать только первый предыдущий элемент для вычисления каждого следующего, поскольку каждый элемент уже получен из предыдущего набора и содержит всю информацию о нем, уже взвешенную. Может быть, я могу просто скорректировать формулу веса и получить тот же результат без цикла второго уровня?
Это похоже на пример в Scala (я не уверен, что это правильно: -]). Поскольку в реальном проекте используются отрицательные индексы, рассматривать (1) и (2) как предшествующие (0) в терминах задачи, описанной выше.
import scala.Double.NaN
val a = Array[Double] (8.5, 3.4, 7.1, 5.12, 0.14, 5)
val b = Array[Double] (NaN, NaN, NaN, NaN, NaN, 5)
var i = b.length - 2
while (i >= 0) {
b(i) = a(i) + {
var succession = 0.0
var j = 1
while (i + j < b.length) {
succession += b (i+j) * (1.0-j.toDouble/(b.length - i))
j += 1
}
succession
}
i -= 1
}
b.foreach((n : Double) => println(n))