2017-06-28 3 views
1

Rcppには、std :: list型の行列のリストを作成し、その行列のリストをRに戻すことを意図した関数があります。Rcppから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に行列のリストを返すようにしたいが、私はベクトルのリストを取得します。私は多くを試して、ドキュメントを見ているが、私はこれのための解決策を見つけるように見えることはできません。ラップがその仕事をしているように見えますが、リスト内で行列を再帰的にラップしています。私はしたいので、私はRcppからではなく、R.でこれをやりたい

> 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 ... 

> 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 ... 

しかし、私はこのような何かを取得したい:私はこのような何かを得る

スピードアップを測定するために、関数を純粋にRでプログラムされたものと交換することができる。

本当にありがとうございます。

答えて

3

tofroRC++を変換するために必要な配管を有するarma::fieldクラスを使用します。再現性のないものは、あなたの上記の例のように、フィールドクラスでどのように動作するかのよう

はここに...いくつかのサンプルコードです

#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

自由にupvoteして答えを受け入れる。 – coatless

+0

私は答えを受け入れましたが、私はただ8つの評判しか持っていないので、まだ私はupvoteできません。私は必要なときにそれをするでしょう15;) –

関連する問題