避免在R中的大矩阵中进行循环

时间:2016-10-14 00:34:04

标签: r loops matrix

我有一个非常大的矩阵需要一些计算。由于for循环在R中是非常慢的,我想用一些更智能的函数替换它。

这是我用一个小例子矩阵编写的for循环。

d <- matrix(c(1,1,0,0,1,1,1,0,0), 3,3)
for (i in 1:nrow(d)) {
  for (j in 1:ncol(d)) {
    if (d[i,j] == 1) {
      d[j, i] =1
    } else {d[j,i] = 0}
  }
}

这段代码很好地替换了愿望的值,产生了一个对称矩阵,其中d [i,j] = d [j,i]。但是,当矩阵很大时,它可能需要大量的时间和内存。什么是一种有效的替代方法来完成它?谢谢!!

1 个答案:

答案 0 :(得分:5)

这个怎么样

d[lower.tri(d)] <- (t(d)[lower.tri(d)] == 1)

这为您提供了对称矩阵。请注意,我改为使用转置的下三角形。您希望明智地读取上三角形,但d[upper.tri(d)]将返回列明智的值。另一方面,采用转置的下三角形相当于按行读取上三角形。

根据您提供的示例,上三角形工作正常,因为d[upper.tri(d)]t(d)[lower.tri(d)]都将返回0 1 0。所以这里是一个更大的矩阵的比较:

d <- matrix(c(1,1,0,1,0,1,0,0,0, 1,0,1,0,1,0,1), 4,4)

在这种情况下,d[upper.tri(d)]将返回0 0 1 0 1 0,而t(d)[lower.tri(d)]将返回0 0 0 1 1 0

比较:

d2 <- d
d2[lower.tri(d2)] <- (t(d2)[lower.tri(d2)] == 1)

for (i in 1:nrow(d)) {
    for (j in 1:ncol(d)) {
        if (d[i,j] == 1) {
            d[j, i] =1
        } else {d[j,i] = 0}
    }
}

all.equal(d2, d)
## TRUE