我有一个非常大的矩阵需要一些计算。由于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]。但是,当矩阵很大时,它可能需要大量的时间和内存。什么是一种有效的替代方法来完成它?谢谢!!
答案 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