是否可以像以下一样对代码进行矢量化?
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()
循环?
答案 0 :(得分:10)
通常,如果您需要矢量化解决方案,则需要解决recurrence relation。
答案 1 :(得分:5)
在示例中,您可以计算x [i]的公式并查看它是否可以进行矢量化。在这种情况下,我认为cumprod可能有用。
x <- c(1, cumprod(2*y)[1:99])
对于某些情况,您还可以在卷积或递归模式下使用filter
命令。见?filter
但是,如果无法计算出适合上述模具的第n个值的公式,您可以尝试使用inline
或Rcpp
这样的包来编写这是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);