2014-01-24 2 views
1

Я пытаюсь вычислить свертку двух дискретных вероятностных распределений в R. У меня есть два вектора, каждый из которых содержит вероятности. Мне нужно вычислить третий вектор, который имеет объединенные вероятности двух предыдущих векторов. I-я позиция в третьем векторе содержит сумму вероятностей (a [j] * b [k]) для всех j + k = i. У меня есть следующие функции для этого:Более эффективная работа матрицы в R

convolute <- function(a, b){ 

    out <- rep(0, (length(a)+741)) 

    for(i in 1:length(a)){ 

     for (j in 1:length(b)){ 

      out[i + j] <- out[i+j] + (a[i]*b[j]) 


     } 
    } 

    return(out) 
} 

Моя проблема заключается в том, что эта функция должна быть вызвана несколько раз (> 1000000) и (относительно) медленно. Есть ли более эффективный способ в R для достижения этой операции, без использования двух циклов? Длина будет либо 741 или 1482, б всегда 741.

Спасибо

+0

Не могли бы вы показать нам некоторые входные данные ('a' и' b') и что вы ожидаете от 'out' также выглядеть? –

+2

Вы пробовали функцию 'convolve' R? – Pop

+0

Спасибо. Функция convolve работает. (входные данные - это вероятности в диапазоне 0-1, так что сумма (a) = 1), выход также имеет это свойство) –

ответ

4
convolve(a, rev(b), type="open") 

ли такой же, как ваша функция, за исключением того, что функция начинается с 0 и convolve нет:

> a <- runif(1000, 0, 1) 
> b <- runif(741, 0, 1) 
> c1 <- convolute(a, b) 
> c2 <- convolve(a, rev(b), type="open") 
> 
> all.equal(c1[-1], c2) 
[1] TRUE 
> system.time(c1 <- convolute(a, b)) 
    user system elapsed 
    4.152 0.000 4.155 
> system.time(c2 <- convolve(a, rev(b), type="open")) 
    user system elapsed 
    0.000 0.000 0.001 
+0

Спасибо. Я использовал convolve ранее (для немного другого использования), который он не работал, поэтому мне не приходило в голову использовать его здесь. –

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