Оптимизация функции скользящего среднего

Я пытаюсь улучшить код и ускорить работу в 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++) {

Я чувствую, что я недостаточно строг, и я был бы очень признателен, если бы кто-то мог помочь мне улучшить мой код и в конечном итоге максимально ускорить работу функции.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]