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

ach*_*low 0 loops r 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}
  }
}
Run Code Online (Sandbox Code Playgroud)

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

par*_*sw3 5

这个怎么样

d[lower.tri(d)] <- (t(d)[lower.tri(d)] == 1)
Run Code Online (Sandbox Code Playgroud)

这为您提供了对称矩阵.请注意,我正在采用转置的下三角形.您希望明智地读取上三角形,但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)
Run Code Online (Sandbox Code Playgroud)

这种情况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
Run Code Online (Sandbox Code Playgroud)