首页 > 解决方案 > 数值向量:在 epsilon 内彼此相距很远的条目

问题描述

vec考虑如下的正数值向量:

vec <- c(0.453, 0.864, 0.340, 0.941, 0.612, 0.899, 0.910, 0.238, 0.184, 0.803)

假设我们想要找到在 epsilon 内彼此相距很远的元素。一种可能的方式是:

epsilon <- 0.1
cmb <- combn( length(vec), 2 )
diff <- vec[ cmb[1,] ] - vec[ cmb[2,] ]
cmb [ ,abs(diff) <= epsilon ]

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#[1,]    2    2    2    2    4    4    6    6    8
#[2,]    4    6    7   10    6    7    7   10    9

一个众所周知的问题:我们能做得更好吗?

标签: rvector

解决方案


你没有定义“更好”。这是一个替代方案:

epsilon <- 0.1
d <- as.matrix(dist(vec))
which(d < epsilon & lower.tri(d), arr.ind = TRUE)
#   row col
#4    4   2
#6    6   2
#7    7   2
#10  10   2
#6    6   4
#7    7   4
#7    7   6
#10  10   6
#9    9   8

通过避免对密集矩阵的强制,可以进一步优化大型输入向量的性能:

d <- dist(vec)
n <- attr(d, "Size")
i <- which(d < epsilon)
rown <- (n-1):1
cols <- findInterval(i, c(0,cumsum(rown)), left.open = TRUE)
rows <- i - cumsum(rown)[cols - 1] + (1:n)[cols]
rbind(cols, rows)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#cols    2    2    2    2    4    4    6    6    8
#rows    4    6    7   10    6    7    7   10    9

推荐阅读