Есть ли способ ускорить этот тройной цикл? - PullRequest
1 голос
/ 30 сентября 2019

Мне трудно ускорить эту функцию (что становится критически важным для меня, когда размер выборки составляет 10000). Поможет ли мне в этом какая-нибудь добрая душа?

Я делаю игрушку с полностью воспроизводимым кодом, приведенным ниже:

omega_w <- function(X){
  X <- as.matrix(X)
  n <- dim(X)[1]
  kdim <- dim(X)[2]
  omega <- matrix(0, nrow = n, ncol = n) # n x n

  for (j in 1:n){
    for (l in 1:j){
      for (r in 1:n){
        x.jr <- ((X[j,])-(X[r,]))
        x.lr <- ((X[l,])-(X[r,]))
        if (l==r && j==r){
          omega[j,l] <- omega[j,l] + 2*pi }
        else if ((l==r || j==r) && j!=l){
          omega[j,l] <- omega[j,l] + pi }
        else if (l==j && j!=r){
          omega[j,l] <- omega[j,l] + pi } 
        else {
          omega[j,l] <- omega[j,l] + abs(pi - acos(cor(x.jr,x.lr)))
        }
      }
    }
  }
  omega <- (omega + t(as.matrix(Matrix::tril(omega,-1)))) * pi^(kdim/2-1)/gamma(kdim/2 +1)
  return(omega)
} 

x <- as.matrix(rnorm(10000*20),10000,20)
w <- omega_w(x)

Я был бы очень признателен за любые рекомендации, чтобы сделать эту функцию "лучше" иболее вычислительно эффективен. Я не очень беспокоюсь о больших матрицах, так как я буду использовать их с размерами выборки, примерно такими же, как в примере.

Заранее спасибо!

...