STL 向量
标准模板库(stl)是一个包含灵活算法和数据结构的 C++ 库。比如,stl 中的 double 向量就是 Rcpp 的 NumericVector 在"原生 C++"中的等价物。下面的代码创建了一个包含 10 个元素、名为 x 的标准 double 向量。
std::vector<double> x(10);
通常,更适合坚持使用 Rcpp 的向量类型,因为它能让您使用许多与 R 等价且便捷的方法,包括 mean()、round() 和 abs()。不过,stl 向量的一个优势是:它们可以动态改变大小,而且每次无需为数据拷贝付出开销。这使我们能够像上一练习中的"bad"函数那样编写更简单的代码,同时保持与"good"代码相当的性能。
本练习是课程的一部分
用 Rcpp 优化 R 代码
练习说明
- 完成
select_positive_values_std()的定义,这是一个基于 stl 向量的正数筛选函数。- 将函数的返回类型设为标准 double 向量,即
std::vector<double>。 - 定义一个大小为
0的标准 double 向量positive_x。 - 在
for循环的if代码块中,使用positive_x的push_back()将x的第 i 个元素追加进去。
- 将函数的返回类型设为标准 double 向量,即
- 为便于对比,上一练习中的
good_select_positive_values_cpp()已在您的工作区可用。请查看控制台输出,了解这两个函数的相对速度。
交互式实操练习
通过完成这段示例代码来试试这个练习。
#include
using namespace Rcpp;
// Set the return type to a standard double vector
// [[Rcpp::export]]
___ select_positive_values_std(NumericVector x) {
int n = x.size();
// Create positive_x, a standard double vector
___;
for(int i = 0; i < n; i++) {
if(x[i] > 0) {
// Append the ith element of x to positive_x
___;
}
}
return positive_x;
}
/*** R
set.seed(42)
x <- rnorm(1e6)
# Does it give the same answer as R?
all.equal(select_positive_values_std(x), x[x > 0])
# Which is faster?
microbenchmark(
good_cpp = good_select_positive_values_cpp(x),
std = select_positive_values_std(x)
)
*/