代码之家  ›  专栏  ›  技术社区  ›  RLave

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

  •  0
  • RLave  · 技术社区  · 7 年前

    我想找到一种方法来提高这个函数的性能。

    基本上,它给出了两条曲线之间的面积和一个增加的窗口。

    在每次迭代中 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 回复  |  直到 7 年前
        1
  •  2
  •   Aaron Hayman    7 年前
    area_function = function(y_curve1, y_curve2) {
      dv <- y_curve2 - y_curve1
      return(cumsum(dv) - dv[1]/2 - dv/2)
    }
    

    x 所以我把它丢弃了。这种集成利用了trapesium规则。使用内置的基函数 cumsum 速度很快。然后你需要去掉一半的第一个值和一半的兴趣点的值。