2012-11-25 59 views
3

在一个只有整数填充的100x100矩阵中,我在以(和包括)元素1,1开头的每行内进行成对比较。对于任何比较结果为TRUE,我在另一个预分配矩阵[x]的相应元素上计算+1 [这只是一个相似性矩阵]。提高嵌套for循环中的性能?

使用嵌套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 
+1

请包含机器可读的代码,用于小结果示例。 'dput'做得很好。 –

+0

明白了。感谢您的建议。 – user1789784

+1

好的,不,我得到了,x中的条目是j,k条目,而不是i,j条目。我不明白你为什么这样做,但显然不是我写的先前答案。 – John

回答

5

这是约100使用您的100-by-100 result矩阵在我的机器上更快(50ms):

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实现。虽然我不确定你会得到更多更多,因为我的建议已经使用了相当数量的矢量化。

+0

出色的工作。我得到了向量化第三个for循环的第一个解决方案;第二个使用apply是我试图实现,没有成功。谢谢。 – user1789784

+0

+1好的工作,我意识到我的错误在昨晚睡觉前应答,并醒来,答案已经上升。 :) – John