2013-03-04 76 views
1

我是R新手,无法向量化特别慢的嵌套循环。循环遍历中心列表(存储在结构中的向量),并找到这些向量与下面名为x的数组的行之间的距离。我知道这需要为了速度而进行矢量化,但是无法找出适当的功能或使用apply来做到这一点。R中的嵌套循环缓慢

clusterCenters <- matrix(runif(10000),nrow=100) 
clusterMembers <- matrix(runif(400000),nrow=4000) 

features <- matrix(0,(dim(clusterMembers)[1]),(dim(clusterCenters)[1])) 

for(c in 1:dim(clusterCenters)[1]){ 
    center <- clusterCenters[c,] 
    for(v in 1:(dim(clusterMembers)[1])){ 
    vector <- clusterMembers[v,] 
    features[v,c] <- sqrt(sum((center - vector)^2)) 
    } 
} 

感谢您的任何帮助。

+2

请提供一个[reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。如果你这样做了,你会注意到你的代码中的语法错误。 – 2013-03-04 17:33:09

+1

(-1)如果你提供了一个可重复的例子,那么预计会有一个例子,特别是在35个问题之后,我会很高兴得票。 – Arun 2013-03-04 17:39:33

+0

@阿伦,我的道歉。我知道得更好,而且很sl。。我已经生成了一个可重现的例子来说明问题,但实际问题涉及的维度要大得多。 – Sevenless 2013-03-04 18:00:30

回答

2

您可以利用R的回收规则来加快速度。 但是您必须知道并说明了R按列主要顺序存储矩阵的事实。您通过调换clusterMembers来完成此操作,然后将沿着t(clusterMembers)的列回收center向量。

set.seed(21) 
clusterCenters <- matrix(runif(10000),nrow=100) 
clusterMembers <- matrix(runif(400000),nrow=4000) 
# your original code in function form 
seven <- function() { 
    features <- matrix(0,(dim(clusterMembers)[1]),(dim(clusterCenters)[1])) 
    for(c in 1:dim(clusterCenters)[1]){ 
    center <- clusterCenters[c,] 
    for(v in 1:(dim(clusterMembers)[1])){ 
     vector <- clusterMembers[v,] 
     features[v,c] <- sqrt(sum((center - vector)^2)) 
    } 
    } 
    features 
} 
# my fancy function 
josh <- function() { 
    tcm <- t(clusterMembers) 
    Features <- matrix(0,ncol(tcm),nrow(clusterCenters)) 
    for(i in 1:nrow(clusterCenters)) { 
    # clusterCenters[i,] returns a vector because drop=TRUE by default 
    Features[,i] <- colSums((clusterCenters[i,]-tcm)^2) 
    } 
    Features <- sqrt(Features) # outside the loop to avoid function calls 
} 
system.time(seven()) 
# user system elapsed 
#  2.7  0.0  2.7 
system.time(josh()) 
# user system elapsed 
# 0.28 0.11 0.39 
identical(seven(),josh()) 
# [1] TRUE