Я пытаюсь улучшить код и ускорить работу в C ++ (Rcpp) (центрированной) взвешенной функции скользящего среднего, которую я кодировал.
Пример того, что делает функция roll_mean. Обратите внимание, что функция работает независимо от размера x и адаптируется к обоим хвостам моих данных.
w=c(1/2,1,1/2)
x=c(4,2,6,12)
res=c(2,5,7,3)
res=c((x[1:2]*w[2:3])/sum(w[2:3]),x[1:3]*w[1:3]/sum(w[1:3]),x[2:4]*w[1:3]/sum(w[1:3]),x[3:4]*w[1:2]/sum(w[1:2]))
Файл PartialMA.cpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector roll_mean(const NumericVector& x,
const NumericVector& w) {
int n = x.size();
int w_size = w.size();
int size = (w_size - 1) / 2;
NumericVector res(n);
int i, ind_x, ind_w;
double tmp_wsum, tmp_xwsum, tmp_w;
for (i = 0; i < n; i++) {
tmp_xwsum = 0;
tmp_wsum = 0;
for (ind_x = i - size, ind_w = 0; ind_x < i + size; ind_x++, ind_w++) {
if((ind_x >= 0) & (ind_x < n)){
tmp_w = w(ind_w);
tmp_xwsum += x(ind_x) * tmp_w;
tmp_wsum += tmp_w;
}
}
res[i] = tmp_xwsum / tmp_wsum;
}
return res;
}
Я попытался заменить цикл + оператор if этим, чтобы минимизировать количество итераций:
for (ind_x = std::max(0, i - size), ind_w = std::max(0, size-1); ind_x < std::min(n, i + size); ind_x++, ind_w++) {
Я чувствую, что я недостаточно строг, и я был бы очень признателен, если бы кто-то мог помочь мне улучшить мой код и в конечном итоге максимально ускорить работу функции.
Задача ещё не решена.
Других решений пока нет …