R/distMatrix.R

#' Calculate the distance matrix between training and test dataset or one matrix itself
#'
#' @param x is an object
#' @return y is the output
#' @export

distMatrix <- function(mat.train, itself = TRUE, mat.test = NULL,
                       n.train, n.test = NULL,
                       cores = 2, euclidean = TRUE){

  # Parallilisation Settings
  registerDoParallel(cores=cores)
  CL <- makeCluster(cores)

  length_x <- ncol(mat.train)

  if(itself){

    distances <- foreach(i = 1:n.train, .packages = c("tcltk","SMLpractical"), .combine = cbind) %dopar%{
      if(!exists("pb")) pb <- tkProgressBar("Progress Distance Matrix", min=0, max=n.train)

      x.train <- mat.train[i,]

      distances <- matrix(0, nrow=n.train, ncol=1)
      for(j in 1:i){
        x.test <- mat.train[j,]
        distances[j] <- classDist(x.train,x.test,length_x, euclidean = euclidean)
      }

      progress <- setTkProgressBar(pb, i)
      distances
    }
    stopCluster(CL)

    distances <- distances + t(distances)

  } else {


    distances <- foreach(i = 1:n.train, .packages = c("tcltk","SMLpractical"), .combine = cbind) %dopar%{
      if(!exists("pb")) pb <- tkProgressBar("Progress Distance Matrix", min=0, max=n.train)

      x.train <- mat.train[i,]

      distances <- matrix(0, nrow=n.test, ncol=1)
      for(j in 1:n.test){
        x.test <- mat.test[j,]
        distances[j] <- classDist(x.train,x.test,length_x, euclidean = euclidean)
      }

      progress <- setTkProgressBar(pb, i)
      distances
    }
    stopCluster(CL)
  }

  return(distances)
}
thomaswiemann/SMLpractical documentation built on May 28, 2019, 12:23 p.m.