Векторизация из разных размерных массивов в R - PullRequest
0 голосов
/ 22 декабря 2018
for(i in 1:1111){
for(j in 1:2222){
for(k in 1:3333){

      y[i, j, k] <- a[i] + b[j, k] 
}
}
}

где a[ ], b[, ], y[ , , ] - массивы.

Этот код занимает много времени, поэтому я хочу, чтобы векторизация или любая обработка была более быстрым.

У кого-то есть идеичтобы сделать код быстрее.

Один из способов решения проблемы, я не уверен, но с помощью корректировки индекса путем репликации массивов все идет хорошо?

см. Для репликации:

Репликация 2-мерной матрицы для создания 3-мерного массива (в R)

Я не уверен, что формат массива создает кодбыстрее.

Если размеры массивов a,b,y совпадают, то код упростится на

y <-a+b

, и этот код выглядит быстрее.

1 Ответ

0 голосов
/ 22 декабря 2018

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

f1 <- function(m, n, o){
  a <- seq_len(m)
  b <- matrix(1:(n*o), nrow = n)
  y <- array(0, dim = c(m, n, o))
  for(i in seq_len(m)){
    for(j in seq_len(n)){
      for(k in seq_len(o)){
        y[i, j, k] <- a[i] + b[j, k] 
      }
    }
  }
  y
}

f2 <- function(m, n, o){
  a <- seq_len(m)
  b <- matrix(1:(n*o), nrow = n)
  y <- array(0, dim = c(m, n, o))
  for(i in seq_len(m)){
    y[i, , ] <- a[i] + b
  }
  y
}

m <- 11
n <- 22
o <- 33

y <- f1(m, n, o)
z <- f2(m, n, o)

identical(y, z)
#[1] TRUE

Теперь проверьте производительность.

library(microbenchmark)
library(ggplot2)

mb <- microbenchmark(
  f1 = f1(m, n, o),
  f2 = f2(m, n, o)
)

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