我有一个包含一堆双元素的大向量.给定一个百分位向量的数组,例如percentile_vec = c(0.90, 0.91, 0.92, 0.93, 0.94, 0.95).我目前正在使用Rcpp sort函数对大向量进行排序,然后找到相应的百分位值.这是主要代码:
// [[Rcpp::export]]
NumericVector sort_rcpp(Rcpp::NumericVector& x)
{
std::vector<double> tmp = Rcpp::as<std::vector<double>> (x); // or NumericVector tmp = clone(x);
std::sort(tmp.begin(), tmp.end());
return wrap(tmp);
}
// [[Rcpp::export]]
NumericVector percentile_rcpp(Rcpp::NumericVector& x, Rcpp::NumericVector& percentile)
{
NumericVector tmp_sort = sort_rcpp(x);
int size_per = percentile.size();
NumericVector percentile_vec = no_init(size_per);
for (int ii = 0; ii < size_per; ii++)
{
double size_per = tmp_sort.size() * percentile[ii];
double size_per_round;
if (size_per < 1.0)
{
size_per_round = 1.0; …Run Code Online (Sandbox Code Playgroud) 受艺术http://gallery.rcpp.org/articles/parallel-distance-matrix/的启发,我尝试使用RcppParallel在高维参数空间中运行强力搜索,以便使用多线程进行回测.我陷入了如何在部件中调用自定义函数的问题struct.这个想法是这样的:
首先,首先NumericMatrix params_mat在R中创建一个参数矩阵,然后使用带有List, NumericVector, CharacterVector数据类型的回测数据,例如List Data_1, NumericVector Data_2, CharacterVector Data_3, ...,对于每个参数场景都是静态的params_vec(注意它是行的params_mat).
接下来,定义返回测试函数,该函数输出包含3个关键变量的向量以评估策略性能.
这是我的一个例子params_mat,并Backtesting_Fun可以在R和RCPP,分别运行.
//[[Rcpp::export]]
NumericMatrix data_frame_rcpp(const Rcpp::List& list_params)
{
NumericMatrix res = list_params[0];
return res;
}
# R codes to generate params_mat
params <- expand.grid (x_1=seq(1,100,1), x_2=seq(3,100,2), ..., x_n=seq(4,200,1));
list_params = list(ts(params));
tmp_params_data = data_frame_rcpp(list_params);
params_mat = matrix(tmp_params_data, ncol = ncol(tmp_params_data), dimnames = NULL);
params_vec = params_mat[ii,];
# User-defined Rcpp codes for …Run Code Online (Sandbox Code Playgroud) 我编写了以下编译的Rcpp代码,但速度并不像预期的那么快.
// [[Rcpp::export]]
NumericVector combine_list_to_vec (const Rcpp::List& list)
{
int list_size = list.size();
int large_vec_size = 0;
IntegerVector start_index(list_size);
IntegerVector end_index(list_size);
for (int ii = 0; ii < list_size; ii++)
{
NumericVector vec = list[ii];
start_index[ii] = large_vec_size;
large_vec_size += vec.size();
end_index[ii] = large_vec_size - 1;
}
NumericVector large_vec(large_vec_size); // Creating object after getting its size
for (int ii = 0; ii < list_size; ii++)
{
int current_start_index = start_index[ii];
NumericVector vec = list[ii];
for (int jj = 0; jj …Run Code Online (Sandbox Code Playgroud) 我编写了以下Rcpp代码,该代码可以编译,但未给出预期的结果。
// [[Rcpp::export]]
RObject test_1 (Rcpp::NumericVector& x)
{
NumericVector x1;
if (x.size() < 5)
{
NumericVector x1(x.size()*3);
for (int ii = 0; ii < x.size(); ii++)
{
x1[ii] = sqrt(x[ii]);
}
}
else
{
NumericVector x1(x.size()*2);
for (int ii = 0; ii < x.size(); ii++)
{
x1[ii] = sqrt(x[ii]);
}
}
return x1;
}
Run Code Online (Sandbox Code Playgroud)
x1,返回向量在if语句外部声明,其中返回向量x1的大小可以变化。但是,如果我声明NumericVector的大小,它将创建一个新对象,但是x1在空向量中返回。
以下代码有效:
// [[Rcpp::export]]
RObject test (const Rcpp::NumericVector& x)
{
NumericVector x1;
if (x.size() < 5)
{
NumericVector tmp(x.size()*3);
for (int ii = 0; ii < …Run Code Online (Sandbox Code Playgroud)