通过增加窗口来计算曲线之间的面积来提高循环性能

时间:2018-09-06 07:32:33

标签: r performance vectorization

我想找到一种改善此功能性能的方法。

基本上,它给出了两个曲线之间的区域,并带有增大的窗口。

在每次迭代中,用于积分的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 :(得分:2)

area_function = function(y_curve1, y_curve2) {
  dv <- y_curve2 - y_curve1
  return(cumsum(dv) - dv[1]/2 - dv/2)
}

不确定我是否了解x的用途,因此已将其丢弃。这种整合利用了梯形规则。使用内置的基本函数cumsum非常快。然后,您需要取走第一个值的一半和感兴趣点的一半。