Оптимизация структурирования с помощью Rcpp - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь ускорить функцию breakpoints.formula в пакете strucchange ( source ).Он имеет узкое место в таблице exte.RSS.table.Вот моя попытка перемонтировать цикл for(i in my.index) внутри него с помощью Rcpp:

// [[Rcpp::export]]
NumericMatrix fillMyRSStable(NumericMatrix myRSStable, List & RSStriang, IntegerVector & myIndex, int m, float h) {

  NumericMatrix myRSStableCPY = clone(myRSStable);
  CharacterVector indexI(1), indexj(1);
  int n = myIndex.size();
  CharacterVector nms = rownames(myRSStableCPY);

  for(int myIndexI = 0; myIndexI < n; ++myIndexI) {
    int i = myIndex[myIndexI];

    IntegerVector potIndex =  seq((m - 1)*h, i - h);
    //sapply
    int np = potIndex.size();
    NumericVector breakRSS(np);

    for(int pin = 0; pin < np; ++pin) {
      int j = potIndex[pin];
      NumericVector RSStriangI = as<NumericVector>(RSStriang[j]);

      indexj[0] = j;
      IntegerVector matchedIdxJ = match(indexj, nms);

      breakRSS[pin] = myRSStableCPY(matchedIdxJ[0] - 1, 1) + RSStriangI[i - j - 1];
    }
    // end sapply
    int opt = which_min(breakRSS);

    indexI[0] = i;
    IntegerVector matchedIdxI = match(indexI, nms);

    myRSStableCPY(matchedIdxI[0] - 1, 2) = potIndex[opt];
    myRSStableCPY(matchedIdxI[0] - 1, 3) = breakRSS[opt];
  }
  return myRSStableCPY;
}

Этот код немного быстрее, чем R, но не так быстро, как я думал.Какие-нибудь явные недостатки в коде ниже, которые кто-то может заметить?Любой общий (или конкретный) совет будет полезен.

Редактировать Код для профилирования:

library(strucchange)
library(profvis)
library(microbenchmark)
data("Grossarl")
pr <- profvis(microbenchmark(Grossarl.bp <- breakpoints(fraction ~ 1, data = Grossarl, h = 0.1)))
htmlwidgets::saveWidget(pr, "profile.html")

Ссылка на мою версию Rcpp: https://github.com/s-Nick-s/strucchange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...