我想找到一种改善此功能性能的方法。
基本上,它给出了两个曲线之间的区域,并带有增大的窗口。
在每次迭代中,用于积分的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
答案 0 :(得分:2)
area_function = function(y_curve1, y_curve2) {
dv <- y_curve2 - y_curve1
return(cumsum(dv) - dv[1]/2 - dv/2)
}
不确定我是否了解x
的用途,因此已将其丢弃。这种整合利用了梯形规则。使用内置的基本函数cumsum
非常快。然后,您需要取走第一个值的一半和感兴趣点的一半。