双循环矩阵而不是循环R

时间:2018-12-09 13:55:47

标签: r loops for-loop matrix apply

我是新用户,使用apply / purrr函数。我不知道何时以及如何使用此功能。我有矩阵的双循环,我想避免它们。有一种方法可以做到吗?我必须执行此操作(请参见下面的代码)

NCols=4
NRows=4

set.seed(1234)
myMat<-matrix(runif(NCols*NRows), ncol=NCols)
myMat

norm=matrix(0,NRows,NCols)

 for (i in 1:nrow(myMat)){
    for (j in 1:nrow(myMat)){
      norm[i,j] <- sum((myMat[i,]-myMat[j,])^2)
    }
  }

谢谢

对@markus使用dist函数,这是更快的方法。

2 个答案:

答案 0 :(得分:5)

尝试dist,因为您似乎想计算欧几里德距离的平方。

dist(myMat, diag = TRUE, upper = TRUE) ^ 2
#          1         2         3         4
#1 0.0000000 0.7408859 0.9713548 0.9768185
#2 0.7408859 0.0000000 0.8285694 0.1746331
#3 0.9713548 0.8285694 0.0000000 0.3690422
#4 0.9768185 0.1746331 0.3690422 0.0000000

答案 1 :(得分:4)

我们可以使用font-size创建所有索引组合,然后使用html遍历所有组合并最终创建矩阵。

16px

相似的想法,但是我们也可以使用1rem

expand.grid

这是当前方法的速度组成部分,其中包括其他答案中的map2_dbl函数。

library(purrr)

ind <- expand.grid(1:NRows, 1:NRows)

norm <- matrix(map2_dbl(ind$Var1, ind$Var2, ~sum((myMat[.x,] - myMat[.y,])^2)),
               NRows, NCols)
norm
#           [,1]      [,2]      [,3]      [,4]
# [1,] 0.0000000 0.7408859 0.9713548 0.9768185
# [2,] 0.7408859 0.0000000 0.8285694 0.1746331
# [3,] 0.9713548 0.8285694 0.0000000 0.3690422
# [4,] 0.9768185 0.1746331 0.3690422 0.0000000