【发布时间】:2016-08-04 02:28:53
【问题描述】:
我有以下函数(funtest)来测试矩阵中是否存在特定向量。向量的长度总是 2,矩阵总是有两列。该函数工作正常,我只想让它更快(最好更快),因为我的矩阵可以有数百到数千行。
x = c(1,2)
set.seed(100)
m <- matrix(sample(c(1,-2,3,4), 500*2, replace=TRUE), ncol=2)
funtest(m,x)
[1] TRUE
这是目前的速度
library(microbenchmark)
microbenchmark(funtest(m, x), times=100)
Unit: milliseconds
expr min lq mean median uq max
funtest(m, x) 1.501247 1.536157 1.674668 1.567826 1.708293 2.900046
neval
100
这是函数
funtest = function(m, x) {
out = any(apply(m,1,function(n,x) all(n==x),x=x))
return(out)
}
【问题讨论】:
-
我本身不是 R 用户,但这看起来像是一个高度矢量化的表达式,因此您可以在没有分支的情况下进行检查。这通常更容易在处理器上并行化,但有时只是比更受域驱动的方法慢。也许最好先收集所有行索引,其中第一个元素等于给定值。然后仅检查已过滤的第二列(仅与步骤 1 中的正索引进行比较;例如布尔评估中的短路)。不过,加速应该受到 ~2 的限制。
-
你绝对应该先尝试一下李哲元的方法,因为它具有更大的加速潜力,并且在矢量化语言中可能感觉更自然。 (但遗憾的是,这一切都归结为 R 的内部结构;与上述替代方案相比,适用的情况)。当然,数据统计也可能在基于分支的方法中发挥作用。
-
我在考虑用某种散列替代方法来在恒定时间内进行搜索?
-
@user3067923 我很确定基于散列的方法由于大常数(复杂性)而一直丢失。这是一个线性复杂度运算,所以我不会那样处理它。 (为了更清楚:您需要查看所有行,这是一个下限;直接比较总是比散列更快;至少如果您对所有列进行散列 -> 可能有一个很好的概率权衡方法有很多列)