R中更有效的矩阵运算

时间:2014-01-24 12:57:59

标签: r

我正在尝试计算R中两个离散概率分布的卷积。我有两个向量,每个向量包含概率。我需要计算第三个向量,它具有前两个向量的组合概率。第三向量中的第i个位置包含所有j + k = i的概率之和(a [j] * b [k])。 我有以下功能:

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)并且(相对)慢。在没有使用两个for循环的情况下,R中是否有更有效的方法来实现此操作? a的长度为741或1482,b始终为741.

谢谢

1 个答案:

答案 0 :(得分: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