我有一些随时间采样的测量数据,想整合它,test dataset包含约 100000 个样本(约 100 秒,1000Hz)的数据。
我的第一个方法是(table
包含时间戳(0..100s)和每个数据点的值(都是 double
s))
# test dataset available (gzipped, 720k) here: http://tux4u.de/so.rtab.gz
table <- read.table("/tmp/so.rtab", header=TRUE)
time <- table$t
data <- table$val
start <- min(time)
stop <- max(time)
sampling_rate <- 1000
divs <- (max(time) - min(time)) * sampling_rate
data_fun <- approxfun(time, data, method="linear", 0, 0)
result <- integrate(data_fun, start, stop, subdivisions=divs)
但不知何故集成会永远运行(就像一个无限循环,完全耗尽一个 CPU)。所以我查看了这些值:
> start
[1] 0
> stop
[1] 98.99908
> divs
[1] 98999.08
奇怪的是,当我评估
> integrate(data_fun, 0, 98, subdivisions=100000)$value + integrate(data_fun, 98, 99)$value
[1] 2.640055
它有效(计算时间<3s)但下面的评估(应该是相同的)
> integrate(data_fun, 0, 99, subdivisions=100000)$value
也永远不会终止。甚至这个(实际上是上面工作的一个子积分)也不会终止:
> integrate(data_fun, 0, 89, subdivisions=100000)$value
对我来说,它何时有效以及何时无效似乎有点随机。我做错了什么或者我能以某种方式改进流程吗?
谢谢!
(提示:采样点不一定均匀分布)
最佳答案
Ekhem,你知道你可以总结一下吗? cumsum
将快速执行此操作:
cumsum(table$val)*diff(table$t)[1]
对于不等差,你可以使用:
cumsum(table$val[-nrow(table)]*diff(table$t))
不需要更复杂的数字,因为这种情况下的数据采样非常密集;尽管如此,总会有比通过插值器更好的方法。
关于r - 在 R 中集成采样数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6552844/