【问题标题】:Hints to improve performance in nested for loop?在嵌套 for 循环中提高性能的提示?
【发布时间】:2012-11-25 02:36:59
【问题描述】:

在仅填充整数的 100x100 矩阵中,我在每一行内执行成对比较,从元素 1,1 开始(包括)。对于任何为 TRUE 的比较,我在另一个预分配矩阵 [x](这只是一个相似性矩阵)中的相应元素处计算 +1。

使用嵌套的 for 循环,此操作需要对每一行进行 N*(N-1)/2 + N 次比较。在我的机器上,下面的代码不会花费太长时间,但是有更好(好的,更快,更优雅)的方法吗?我已经考虑过使用“应用”的矢量化计算,但到目前为止,还没有任何乐趣。

result <- matrix( round(rnorm(10000,sample(5))), ncol=100)
x <-matrix(data=0, nrow=100,ncol=100)

system.time(
for (i in 1:100) {
  for (j in 1:100) {
    for (k in j:100) {
        if (result[i,][j] == result[i,][k]) {
        x[j,][k] = x[j,][k] + 1
        }
    }
  }
}
)
user  system elapsed
6.586   0.599   7.192

这是一个小例子:

“结果”矩阵

      [,1] [,2] [,3] [,4]
[1,]    1    6    1    1
[2,]    6    1    5    3
[3,]    1    5    4    4
[4,]    2    3    4    2

structure(c(1, 6, 1, 2, 6, 1, 5, 3, 1, 5, 4, 4, 1, 3, 4, 2), .Dim = c(4L,4L))

代码应用后,我期望在x矩阵中:

      [,1] [,2] [,3] [,4]
[1,]    4    0    1    2
[2,]    0    4    0    0
[3,]    0    0    4    2
[4,]    0    0    0    4

【问题讨论】:

  • 请为小result 示例提供机器可读代码。 dput 做得很好。
  • 知道了。感谢您的建议。
  • 好的,不,我明白了,x 中的条目是 j,k 条目,而不是 i,j 条目。我不明白你为什么这样做,但这显然不是我之前写的答案。

标签: r


【解决方案1】:

在我的机器上使用您的 100×100 result 矩阵,这大约快 100 倍(50 毫秒):

for (i in 1:ncol(result))
   for (j in i:ncol(result))
      x[i, j] <- sum(result[, i] == result[, j])

这大约快 200 倍,但可能有点难以理解:

x <- apply(result, 2, function(y)colSums(result == y))
x[lower.tri(x)] <- 0

如果它仍然不够快,不符合您的口味,我会看看这个确切的功能是否尚未在众多距离包之一中实现,或者尝试Rcpp 实现。虽然我不确定你会得到更多,因为我的建议已经使用了大量的矢量化。

【讨论】:

  • 出色的工作。我得到了矢量化第三个 for 循环的第一个解决方案;第二个使用 apply 是我试图实现的目标,但没有成功。谢谢。
  • +1 干得好,我昨晚睡觉前意识到我的错误回答,然后醒来,答案已经出来了。 :)
猜你喜欢
  • 2012-11-25
  • 2019-04-01
  • 1970-01-01
  • 2021-12-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多