Как я могу вернуть список матриц из Rcpp в R?

2

У меня есть функция в Rcpp, которая делает что-то вроде этого: она создает список матриц типа std :: list и намеревается вернуть этот список матриц обратно в R.

Приведу здесь приведенный пример:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
Rcpp::List splitImagesRcpp(arma::mat x) 
{
   std::list<arma::mat> listOfRelevantImages;
   int relevantSampleSize = x.n_rows;
   for(int k = 0; k < relevantSampleSize; ++k)
   {
      listOfRelevantImages.push_back(x.row(k));
   }
   return wrap(listOfRelevantImages);
}

Проблема здесь в том, что я хочу вернуть в R список матриц, но я получаю список векторов. Я много пытался и смотрел документацию, но я не могу найти решение для этого. Похоже, что wrap выполняет свою работу, но он также рекурсивно переносит мои матрицы внутри списка.

Я получаю что-то вроде этого:

> str(testingMatrix)
List of 200
 $ : num [1:400] 1 1 1 1 1 1 1 1 1 1 ...
 $ : num [1:400] 1 1 1 1 1 1 1 1 1 1 ...

Но я хочу получить что-то вроде этого:

> str(testingMatrix)
List of 200
 $ : num [1:40, 1:10] 1 1 1 1 1 1 1 1 1 1 ...
 $ : num [1:40, 1:10] 1 1 1 1 1 1 1 1 1 1 ...

Я хочу сделать это из Rcpp, а не в R. Это потому, что я хочу иметь возможность обменять функцию с помощью только R-запрограммированного, чтобы измерить ускорение.

Любая помощь могла бы быть полезна!

Теги:
matrix
rcpp
armadillo

1 ответ

6
Лучший ответ

Используйте arma::field класс, который имеет необходимую сантехнику для преобразования в и Фро R и C++.

Здесь некоторый пример кода относительно того, как можно было бы работать с полевым классом, как ваш пример выше, не воспроизводится...

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::field<arma::mat> splitImagesRcpp(arma::mat x) {

    // Sample size
    int relevantSampleSize = x.n_rows;

    // Create a field class with a pre-set amount of elements
    arma::field<arma::mat> listOfRelevantImages(relevantSampleSize);

    for(int k = 0; k < relevantSampleSize; ++k)
    {
        listOfRelevantImages(k) = x.row(k);
    }


    return listOfRelevantImages;
}

Пример:

set.seed(1572)
(x = matrix(runif(25), 5, 5))
#           [,1]        [,2]      [,3]      [,4]       [,5]
# [1,] 0.2984725 0.679958392 0.5636401 0.9681282 0.25082559
# [2,] 0.3657812 0.157172256 0.6101798 0.5743112 0.62983179
# [3,] 0.6079879 0.419813382 0.5165553 0.3922179 0.64542093
# [4,] 0.4080833 0.888144280 0.5891880 0.6170115 0.13076836
# [5,] 0.8992992 0.002045309 0.3876262 0.9850514 0.03276458
(y = splitImagesRcpp(x))
#      [,1]     
# [1,] Numeric,5
# [2,] Numeric,5
# [3,] Numeric,5
# [4,] Numeric,5
# [5,] Numeric,5
y[[1]]
#           [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 0.2984725 0.6799584 0.5636401 0.9681282 0.2508256
  • 0
    Большой! Это сработало для меня. Извините, мой пример не воспроизводим, это был мой первый вопрос, размещенный здесь. Я изменю вопрос так, чтобы он был воспроизводимым, аналогично вашему ответу. Спасибо! :)
  • 0
    Не стесняйтесь высказаться и принять ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню