2013-09-24 4 views
2

как можно векторизовать следующий двойной цикл в R?эффективная векторизация двойного цикла для цикла

a <- seq(1,10, length=5) 
b <- seq(0,1, length=4) 
fun <- function(a,b){return(a+b)} 

out <- matrix(NaN, nrow=5, ncol=4) 

    for(i in 1:5) { 
    for(j in 1:4) { 
     out[i, j] <- fun(a[i], b[j]) 
    } 
    } 

Я попытался, например, безуспешно. Пожалуйста, посоветуйте, заранее спасибо

outer(1:nrow(out), 1:ncol(out), FUN = fun(a,b)) 
mapply(out, fun) 
+2

Почему бы не использовать 'outer (a, b, fun)'? – sgibb

ответ

3

насчет:

outer(a, b, '+') 

## > outer(a, b, '+') 
##  [,1]  [,2]  [,3] [,4] 
## [1,] 1.00 1.333333 1.666667 2.00 
## [2,] 3.25 3.583333 3.916667 4.25 
## [3,] 5.50 5.833333 6.166667 6.50 
## [4,] 7.75 8.083333 8.416667 8.75 
## [5,] 10.00 10.333333 10.666667 11.00 
+0

У меня есть гораздо более сложная функция «fun», поэтому я продолжаю получать ошибки «Ошибка во внешнем (a, b, function (ai, bj) {: dims [продукт 900] не соответствует длине объекта [1] «.. Но ваш ответ полезен, спасибо! –

+0

@T_D [This] (http://stackoverflow.com/questions/18110397/why-doesnt-outer-work-the-way-i-think-it-should- in-r/18110630 # 18110630) должен помочь вам в том, как вы можете использовать 'внешний' и переписать свою« забаву ». – agstudy

+0

@T_D Я бы сказал, что после функции, которую вы пытаетесь использовать, –

2

По общему правилу, векторизации самого внутреннего цикла, как правило, достаточно, чтобы получить вам выигрыш в производительности. В этом случае это будет означать:

for(i in 1:5) { 
    out[i,]<- a[i] + b 
} 

Предполагая, что a и b оба имеют длину О (п), то, делая это таким образом, вы убедитесь, что накладные расходы от переборе цикла в R только понесены O (n) раз, а не O (n^2) раз, если вы выполняете обе петли в R. Так как время выполнения алгоритма будет равно O (n^2), то дополнительные O (n) t сильно влияет на время работы.

Конечно, для этого конкретного примера вы можете использовать outer, как и другие.

+0

Я выдвинул свою кандидатуру, потому что кто-то занижен Хотя это не лучшее решение (скорее всего), оно удаляет цикл 'for' и заменяет его векторизацией. Я не думаю, что это заслуживает нисходящего. –

Смежные вопросы