Как сначала разобрать строки в Rcpp :: NumericMatrix - PullRequest
0 голосов
/ 25 февраля 2019

Обычно, когда мы пишем функцию в c ++ для анализа 2D-массива, она проходит через первую строку и затем переходит во вторую.

for(int i = 0; i < ROW_SIZE; i++){
    for(int j = 0; j < COL_SIZE; j++){
        *((Mat+i*COL_SIZE) + j) = value;
    }
}

Однако, когда я использую Rcpp :: NumericMatrix, она анализируетсначала через столбцы.

// [[Rcpp::export]]
NumericMatrix TestMatrixParsing(){
  NumericMatrix xx(4, 5);
  int xsize = xx.nrow() * xx.ncol();
  for (int i = 0; i < xsize; i++) {
    xx[i] = i+100;
  }
  return xx;
}

/*** R
TestMatrixParsing()
#      [,1] [,2] [,3] [,4] [,5]
# [1,]  100  104  108  112  116
# [2,]  101  105  109  113  117
# [3,]  102  106  110  114  118
# [4,]  103  107  111  115  119
*/

Есть ли способ заставить его анализировать строки, так как мой предыдущий код был написан так, чтобы матрица сохранялась в виде последовательных строк, поэтому указатель не должен перескакивать, равный COL_SIZE.

1 Ответ

0 голосов
/ 25 февраля 2019

Rcpp::NumericMatrix просто следует тому, как R выделяет свою память, которая находится в основном режиме столбца.Простым решением будет транспонировать матрицу:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericMatrix TestMatrixParsing(){
  Rcpp::NumericMatrix xx(4, 5);
  int xsize = xx.nrow() * xx.ncol();
  xx = Rcpp::transpose(xx);
  for (int i = 0; i < xsize; ++i) {
    xx[i] = i + 100;
  }
  xx = Rcpp::transpose(xx);
  return xx;
}

/*** R
TestMatrixParsing()
#      [,1] [,2] [,3] [,4] [,5]
# [1,]  100  101  102  103  104
# [2,]  105  106  107  108  109
# [3,]  110  111  112  113  114
# [4,]  115  116  117  118  119
*/

Это может быть слишком дорого для больших матриц.В этом случае, вероятно, лучше всего адаптировать ваш алгоритм.

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