R:摆脱 for 循环和加速代码

标签 r performance loops matrix

我想在不使用函数 m 中的循环的情况下加快计算并获得结果.可重现的例子:

N <- 2500
n <- 500
r <- replicate(1000, sample(N, n))

m <- function(r, N) {
  ic <- matrix(0, nrow = N, ncol = N)
  for (i in 1:ncol(r)) { 
    p <- r[, i]
    ic[p, p] <- ic[p, p] + 1
  }
  ic
}

system.time(ic <- m(r, N))
#  user  system elapsed 
#  6.25    0.51    6.76 
isSymmetric(ic)
# [1] TRUE

for 的每次迭代中循环我们正在处理矩阵而不是向量,那么如何将其向量化?

@joel.wilson 这个函数的目的是计算元素的成对频率。所以之后我们可以估计成对包含概率。

感谢@Khashaa 和@alexis_laz。基准:
> require(rbenchmark)
> benchmark(m(r, N),
+           m1(r, N),
+           mvec(r, N),
+           alexis(r, N),
+           replications = 10, order = "elapsed")
          test replications elapsed relative user.self sys.self user.child sys.child
4 alexis(r, N)           10    4.73    1.000      4.63     0.11         NA        NA
3   mvec(r, N)           10    5.36    1.133      5.18     0.18         NA        NA
2     m1(r, N)           10    5.48    1.159      5.29     0.19         NA        NA
1      m(r, N)           10   61.41   12.983     60.43     0.90         NA        NA

最佳答案

这应该快得多,因为它避免了双索引操作

m1 <- function(r, N) {
  ic <- matrix(0, nrow = N, ncol=ncol(r))
  for (i in 1:ncol(r)) { 
    p <- r[, i]
    ic[, i][p] <- 1
  }
  tcrossprod(ic)
}

system.time(ic1 <- m1(r, N))
#   user  system elapsed 
#   0.53    0.01    0.55  

all.equal(ic, ic1)
# [1] TRUE

简单的“计数/加法”操作几乎总能被向量化
mvec <- function(r, N) {
  ic <- matrix(0, nrow = N, ncol=ncol(r))
  i <- rep(1:ncol(r), each=nrow(r))
  ic[cbind(as.vector(r), i)] <- 1
  tcrossprod(ic)
}

关于R:摆脱 for 循环和加速代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40863125/

相关文章:

r - 如何将 2.8 GB gzipped (40 GB TSV) 文件批量读取到 R 中?

java - 尽管有 UseCMSInitiatingOccupancyOnly 标志,CMS-initial-mark 仍在增加,并导致并发模式失败

javascript - 在 Bonferroni 不等式的 JS 实现中避免多重循环

R. 尝试将元素分配给该对象时未找到对象错误

r - 在 R 中使用 foreach 循环读取 MATLAB .mat 文件时出现问题

用于性能评估的java统计收集

performance - DBI 的 fetchall_hashref 和 fetchall_arrayref 之间的性能差异是什么?

Java:实现数组中重复值的循环

python - 我如何完成以下检查 list 中的第 2 项和/或完成该计划?

r - 使用 SNOW 的 MPI 并行化速度很慢