如何将矢量与自身卷积n次

时间:2015-10-21 22:57:10

标签: r algorithm convolution

假设我有一个向量x,我想与自己卷积n次。在R中这样做的好方法是什么?

假设我们已经有一个函数conv(u,v)来卷积两个向量。

我可以这样做:

autoconv<-function(x,n){
    r<-1;
    for(i in 1:n){
        r<-conv(r,x);
    }
    return(r);
}

有更有效的方法吗?

2 个答案:

答案 0 :(得分:3)

采用var s = "(01)12345678901234(11)060606(17)121212(21)1321asdfght(10)aaabbb", r = {}; s.replace( /\((\d\d)\)([^()]+)/g, function(m,p,d){ r['identifier'+p]=d;return '';} ); console.log(r);的快速傅立叶变换(fft),将其提升到k次方并取反fft。然后将其与执行x kx卷积进行比较。没有包使用。

# set up test data
set.seed(123)
k <- 3 # no of vectors to convolve
n <- 32 # length of x
x <- rnorm(n)

# method 1 using fft and inverse fft
yy <- Re(fft(fft(x)^k, inverse = TRUE) / n)

# method 2 using repeated convolutions
y <- x
if (k >= 2) for(i in 2:k) y <- convolve(x, y, FALSE)

# check that the two methods give the same result
all.equal(y, yy)
## TRUE

答案 1 :(得分:0)

autoconv <- function(x, n){
    if(n == 0){
        return(1)
    } else if(n == 1){
        return(x)
    } else {
        i <- 2
        xi <- conv(x,x)
        while(n %% i != 0){
            i <- i + 1
            xi <- conv(xi,x)
        }
        return(autoconv(xi,n/i))
    }
}

这会针对conv()的每个素数系数调用n一次,而不是n次。