循环以获得更快计算的替代方法

时间:2013-12-10 13:41:28

标签: r matrix

假设我有一个n * p数据帧。

我计算了一个p * p维度的n个矩阵列表(在下面的R脚本中命名为listMat),其中每个矩阵是n个响应者中每个响应者的p个变量之间的距离矩阵。

我想计算一个名为normMat的n * n矩阵,每个元素对应于每个成对距离矩阵之间差异的范数。例如:normMat [1,2]将是名为“diffMat”的矩阵的范数,其中diffMat是矩阵“listMat”列表的第一距离矩阵和第二距离矩阵之间的差异。

我编写了以下脚本,它运行正常,但我想知道是否有更有效的方法来编写它,避免循环(使用例如lapply等等)并使脚本执行更快。

# exemple of n = 3 distances matrix between p = 5 variables
x <- abs(matrix(rnorm(1:25),5,5))
y <- abs(matrix(rnorm(1:25),5,5))
z <- abs(matrix(rnorm(1:25),5,5))

listMat <- list(x, y, z)
normMat <- matrix(NA,n,n)

for (numRow in 1:n){
  for (numCol in 1:n){
    diffMat <- listMat[[numRow]] - listMat[[numCol]]
    normMat[numRow, numCol] <- norm(diffMat, type="F")
  }  
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

尝试:

normMat <- function(x, y) {
    norm(x-y, type="F")
}

sapply(listMat, function(x) sapply(listMat, function(y) normMat(x,y)))