6

是否可以像下面这样矢量化代码?

length(x) <- 100;
x[1]      <- 1;
y         <- rnorm(100);

for(i in 2:100) {
    x[i] <- 2 * y[i] * x[i-1];
}

我很欣赏这是一个微不足道的例子,但它可以说明这个想法。

我经常需要编写代码,其中向量中的第 i 个值取决于第 (i-1) 个值,如果可能的话,我想在不需要for循环的情况下编写它,因为分析建议具有这种类型的函数操作是我代码中的主要瓶颈。

此操作是否可向量化,因此我不需要for()在计算中使用循环?

4

5 回答 5

11

一般来说,如果你想要一个向量化的解决方案,你需要解决递归关系

于 2011-01-14T21:15:09.423 回答
5

在示例中,您可以计算出 x[i] 的公式,看看它是否可以向量化。在这种情况下,我认为 cumprod 可能会起作用。

x <- c(1, cumprod(2*y)[1:99])

在某些情况下,您还可以filter在卷积或递归模式下使用该命令。看?filter

但是,如果无法计算出适合上述模型之一的第 n 个值的公式,您可以尝试使用类似的包inlineRcpp在 C/C++ 中循环编写它。

于 2011-01-14T21:20:06.977 回答
1

这个绘图命令的内部是等价的。重复运行它相当有趣:

情节(c(1, 2^(2:length(x)-1)*cumprod(rnorm(99) )) )

于 2011-01-16T00:04:50.703 回答
1

您可以在 C++ 中编写非垂直化代码:

library(inline)
myfun <- cxxfunction(signature(y="numeric"), body='
Rcpp::NumericVector yvec(y);
int ysize = yvec.size();
Rcpp::NumericVector result(ysize);
if (ysize > 0) {
    result[0] = 1;
    for (int i = 1; i < ysize; i++) {
        result[i] = 2 * yvec[i] * result[i-1];
    }
}
return result;
', plugin="Rcpp")

然后从 R 调用这个函数:

y <- rnorm(100);
x <- myfun(y);
于 2012-11-14T17:47:43.670 回答
0

我还没有这方面的完整细节,但看起来这个功能filter()对于做我需要的事情很有用。

于 2011-01-18T17:53:30.627 回答