2013-12-10 33 views
2

假设我有一个n * p数据帧。循环加速计算的替代方法

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

我想计算一个名为normMat的n * n矩阵,每个元素对应于每个成对距离矩阵之间的差值的范数。例如:normMat [1,2]将是名为“diffMat”的矩阵的常态,其中diffMat是Matrix“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") 
    } 
} 

感谢您的帮助。

回答

2

尝试:

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

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