【问题标题】:Intersection point of two sequential profiles两个连续剖面的交点
【发布时间】:2020-02-07 09:44:06
【问题描述】:

我有两个身份配置文件向量(值介于 0 和 1 之间)和一个固定长度(由基础序列确定)。

我想计算两个配置文件的交叉点,即代表配置文件(具有更高身份)发生变化的点。

我目前的解决方案是基于符号计算和连续数字的乘积计算。你能想出更优雅的方式吗?

a <- c(1,1,1,0.8,0.8,0.8)
b <- c(0.8,0.8,0.8,1,1,1)

z <- sign(a - b)

res <- sapply(2:length(z),function(i){ z[i-1]*z[i] })
idx <- which(res == "-1")

plot(x=1:length(a),y=a,type="b")
points(x=1:length(b),y=b,type="b")
abline(v=idx,col="red")

【问题讨论】:

  • 如果保证交集确实存在,可以使用二分查找。但这仅适用于长数据集。

标签: r math numeric


【解决方案1】:

可能,您可以使用signdiff 获得idx

which(diff(sign(a - b)) != 0)
#[1] 3

所以如果你有ab

a <- c(1,1,1,0.8,0.8,0.8,1,1)
b <- c(0.8,0.8,0.8,1,1,1,0.8,0.8)

这会返回

idx <- which(diff(sign(a - b)) != 0)
idx
#[1] 3 6

情节看起来像:

plot(x= 1:length(a),y=a,type="b")
points(x=1:length(b),y=b,type="b")
abline(v=idx,col="red")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2017-07-12
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多