【问题标题】:R time from nearest zero crossing从最近过零开始的 R 时间
【发布时间】:2017-01-28 12:23:11
【问题描述】:

我会添加列,这些列是到最近过零的时间距离。如果该点在过零之后,则时间距离可以为负。

这里是零交叉的计算和绘图

# Data generation
t=seq(0,10,0.05)
h = sin(t)+3*cos(3*t)
dh = cos(t)-9*sin(3*t)
plot(t,h,type='b')

# Find indices of zero crossings

df <- data.frame(h,dh)
zero_cross_down <- df[-1,] < 0 & df[-nrow(df),] >= 0
zero_cross_up <- df[-1,] >= 0 & df[-nrow(df),] < 0
indx_h_cross_down = which(zero_cross_down[,1])
indx_h_cross_up = which(zero_cross_up[,1])

# Find times of zero crossings and plot
hb<-df[,"h"][indx_h_cross_down]
ha<-df[,"h"][indx_h_cross_down+1]
tb<-indx_h_cross_down*0.05
ta<-(indx_h_cross_down+1)*0.05
tzcd_h <- tb + (ta-tb)/(ha-hb)*(0-hb)
points(tb,0*tzcd_h,col="red",pch='v')

hb<-df[,"h"][indx_h_cross_up]
ha<-df[,"h"][indx_h_cross_up+1]
tb<-indx_h_cross_up*0.05
ta<-(indx_h_cross_up+1)*0.05
tzcu_h <- tb + (ta-tb)/(ha-hb)*(0-hb)

points(tb,0*tzcu_h,col="green",pch='^')

但是,现在,我不知道如何计算,并且 dh 的一列是到最近的十字路口的时间。

【问题讨论】:

  • 您是否正在寻找t 中的元素与您计算的交叉点(向上或向下)之间的时间差的最小绝对值?
  • 我需要到最近的十字路口的未来时间距离。所以,我想要一个向量或另一列相同长度的时间值到最近的交叉点(上/下)。
  • OP 表示穿越后距离可能为负数。
  • @John:请查看更新是否回答了您的问题和/或 OP。

标签: r


【解决方案1】:

如果我正确地解释了 OP 想要什么,我们可以使用以下方法计算 t 中每个元素到 next 最近交叉点(向上或向下)的时间:

dt <- outer(-t,c(tzcd_h,tzcu_h),"+")
dt[dt < 0] <- Inf
dt_cross <- do.call(pmin.int, as.data.frame(dt))

注意事项:

  1. 使用outer 计算每个交叉点和每个t 之间的时间差。这样的结果是一个矩阵,其中每一行对应t中的一个元素,每一列对应一个交叉点,这个矩阵的每个元素都是时间差。
  2. 我们只对正时间差感兴趣(即到下一个路口),因此我们将矩阵中的所有负值设置为Inf
  3. 最后,我们使用一种快速的方法来计算每一行(即t 中的每个元素)的最小时间差,该方法用于执行矩阵的逐行min,详见in this SO answer
  4. 如果需要计算与下一个向上交叉(而不是下一个向上或向下交叉)的时间差,则在outer 计算中将c(tzcd_h,tzcu_h) 替换为tzcu_h。类似地,如果需要计算与下一次交叉路口的时间差,则在outer 计算中将c(tzcd_h,tzcu_h) 替换为tzcd_h。显然,我们也可以分别计算这两者。

生成的dt_cross 是一个与t 长度相同的向量,其中包含到下一个交叉点的最短时间。可以使用df$dt_cross &lt;- dt_cross 将此向量添加到df

head(dt_cross)
##[1] 0.6354627 0.5854627 0.5354627 0.4854627 0.4354627 0.3854627

我们可以将此dt_cross 绘制为覆盖在 OP 代码生成的图上的蓝点,以查看发生了什么:

points(t,dt_cross,col="blue",pch='.')

请注意,dt_cross 的最后 20 个值是 Inf。这是因为找到的最后一个交叉点在t 的这 20 个值之前。


更新到新要求

根据定义,距离是一个度量并且是非负数。下面我们区分时间距离时间差,它们可以是正数、零或负数。如果我们有兴趣计算到最近的下路口的时间距离,那么计算是:

dt_n <- dt_p <- outer(-t,tzcd_h,"+")
dt_p[dt_p < 0] <- Inf
dt_cross_p <- do.call(pmin.int, as.data.frame(dt_p))
dt_n[dt_n > 0] <- -Inf
dt_cross_n <- do.call(pmax.int, as.data.frame(dt_n))
dt_cross <- ifelse(dt_cross_p < -dt_cross_n, dt_cross_p, dt_cross_n)

注意事项:

  1. 像以前一样使用outer 计算每个向下交叉点和t 中的每个元素之间的时间差矩阵。我们将此结果设置为dt_ndt_p
  2. dt_p 将用于为t 中的每个元素找到到下交叉点的最小正时间差。我们将其所有负值设置为Inf,并像以前一样计算其逐行最小值。结果是一个向量dt_cross_p,可以解释为t中每个元素到下一个向下交叉点的最小时间距离。
  3. 相反,dt_n 将用于查找到t 中每个元素的向下交叉点的最大负时间差。我们将其所有正值设置为-Inf 并同样调用pmax。结果是一个向量dt_cross_n,可以解释为t中每个元素到上一个向下交叉点的最小时间距离(最大负时间差)。
  4. 如果dt_cross_p &lt; -dt_cross_ndt_cross_n,则t 中每个元素到最近的向下交叉点的时间差就是dt_cross_p 中的对应元素,否则。我们使用ifelse 以矢量化方式进行此计算。

我们现在有了情节:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2012-12-29
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2021-05-17
    相关资源
    最近更新 更多