Повышение производительности цикла с увеличением окна для расчета площади между кривыми - PullRequest
0 голосов
/ 06 сентября 2018

Я бы хотел найти способ улучшить производительность этой функции.

В основном это дает область между двумя кривыми с увеличивающимся окном.

На каждой итерации range_x, используемый для интегрирования, длиннее, пока не достигнет длины отверстия первого вектора.

library(sfsmisc) # for integrate.xy()

area_function = function(x, y_curve1, y_curve2) {
  y_betw = rep(0, x) # the first value needs to be 0, it changes from the 2nd and so on.
  # this loop goes from 2:length(y)
    for (i in seq_along(y_curve1)[-1]) {
      y_range1 = y_curve1[1:i]
      y_range2 = y_curve2[1:i]
      range_x = 1:length(y_range1)

      y_betw[i] = integrate.xy(range_x, y_range2) - integrate.xy(range_x, y_range1)
    }
  return(y_betw)
}

Воспроизводимый пример с результатами:

set.seed(123)
v1 <- sample(100, 100) # first curve
v2 <- sample(100, 100) # second curve

head(area_function(length(v1), v1, v2), 5)
#[1]   0.00000  -7.50000 -48.66658 -29.62492 -49.95353

1 Ответ

0 голосов
/ 06 сентября 2018
area_function = function(y_curve1, y_curve2) {
  dv <- y_curve2 - y_curve1
  return(cumsum(dv) - dv[1]/2 - dv/2)
}

Не уверен, что понимаю цель x, поэтому я от нее отказался. Эта интеграция использует правило трапеции. Использование встроенной базовой функции cumsum очень быстро. Затем вам нужно убрать половину первого значения и половину значения в точке интереса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...