2013-03-04 75 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