在仅使用整数填充的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
答案 0 :(得分:5)
使用100 x 100 result
矩阵在我的机器上快100倍(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
实现。虽然我不确定你会得到更多,因为我的建议已经使用了相当多的矢量化。