是否可以在R中矢量化矢量元素的顺序更新?

时间:2011-01-14 19:47:07

标签: r vectorization

是否可以像以下一样对代码进行矢量化?

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()循环?

5 个答案:

答案 0 :(得分:10)

通常,如果您需要矢量化解决方案,则需要解决recurrence relation

答案 1 :(得分:5)

在示例中,您可以计算x [i]的公式并查看它是否可以进行矢量化。在这种情况下,我认为cumprod可能有用。

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

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

但是,如果无法计算出适合上述模具的第n个值的公式,您可以尝试使用inlineRcpp这样的包来编写这是C / C ++中的循环。

答案 2 :(得分:1)

此绘图命令的内部是等效的。反复运行它非常有趣:

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

答案 3 :(得分:0)

我还没有完整的详细信息,但看起来函数filter()对我需要的东西很有用。

答案 4 :(得分:0)

您可以在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);