r - 数值向量:在 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
一个众所周知的问题:我们能做得更好吗?
解决方案
你没有定义“更好”。这是一个替代方案:
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
推荐阅读
- html - Angular Material:当值为空时,在初始页面加载时在 Mat-Select 中显示空选项(无)
- python - 如何使用 lambda 函数进行多重分类?
- python-3.x - numpy矢量化操作比循环+矢量化慢?
- winapi - 使用 Rust 截屏的正确方法
- c - 如何在 C 中的二叉搜索树中找到比选定数字更高的下一个节点?
- c# - 使用 Firebase 在 ASP.NET CORE 中返回包含子项的列表
- netlogo - 使用 round 命令时出错以及如何在 NetLogo 6.2 中导出 .csv 表
- python - 从 Python 中的每个 PDF 页面中删除前 5 行
- ruby-on-rails - 如何编写与 React 表单交互的 rspec 测试
- snowflake-sql - 识别所有相关对象的最佳方法