1

私はRを初めて使用し、特に遅いネストされたループをベクトル化するのに問題があります。ループは中心のリスト(構造体に格納されているベクトル)を調べ、これらのベクトルと以下に示す配列の行との間の距離を見つけxます。速度を上げるためにこれをベクトル化する必要があることは知っていますが、そのための適切な関数や使用法を理解することはできませんapply

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))
  }
}

助けてくれてありがとう。

4

1 に答える 1

2

Rのリサイクル規則を利用して、これを少し速くすることができます。ただし、Rが行列を列優先の順序で格納するという事実を知って説明する必要があります。これを転置して行うclusterMembersと、centerベクトルはの列に沿ってリサイクルされますt(clusterMembers)

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
于 2013-03-04T18:41:09.683 に答える