R - Как я могу сделать этот цикл быстрее? - PullRequest
1 голос
/ 24 октября 2019

Есть ли способ ускорить этот цикл в r?

    V=array(NA, dim=c(nrow(pixDF), n))

    for(i in 1:n)
    {
       sdC<-sqrt(det(Cov[,i,]))
       iC<-inv(Cov[,i,])
       V[,i]<-apply(pixDF,1,function(x)(sdC*exp(-0.5*((x-Mean[i,])%*%iC%*%as.matrix((x-Mean[i,]))))))
    }

, где в этом случае pixDF - это матрица с 490000 строками и 4 столбцами, заполненными двойными числами. n = 5. Cov - массив (4,5,4), заполненный "doubles". Mean - это массив (5,4), заполненный также двойными числами.

Этот цикл занимал около 30 минут на моем компьютере. (до редактирования). Прямо сейчас это занимает 1 минуту.

1 Ответ

0 голосов
/ 24 октября 2019

Как отмечает Ронак, трудно помочь без воспроизводимого примера. Но я думаю, что apply можно было бы избежать. Нечто подобное МОЖЕТ работать:

V <- array(NA, dim = c(nrow(pixDF), n))
tpixDF <- t(pixDF)
for (i in 1:n) {
  x <- Cov[, i, ]
  sdC <- sqrt(det(x))
  iC <- solve(x)
  mi <- Mean[i, ]
  k <- t(tpixDF - mi)
  V[, i] <- sdC*exp(-0.5*rowSums(k %*% iC * k))
}

Кроме того, как упоминает Роланд, inv, вероятно, равно solve.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...