17

これは Q に関連する Rcpp 変換です。長い std::vector を Rcpp 行列オブジェクトに変換しようとしていますが、簡単な変換形式があるかどうか知りたいです。当然のことながら、各要素をループして空の Rcpp 行列を埋めることもできますが、これはエラーが発生しやすく、より便利な方法が可能であれば不要になる可能性があります。

私が尋ねている理由は、いくつかの既存の C++ コードで OpenMP を利用したいのですが、Rcpp 行列オブジェクトの要素を OpenMP ループに直接格納することはうまくいかないようです (一方、std::vector オブジェクトをロードして変換するOpenMP ループが完了した後にマトリックスに変換することは、問題に対するまともなアプローチのようです)。

どんな助けでも大歓迎です!

4

2 に答える 2

22

ダークの答えを拡張するには; dimR行列は、実際には属性セットを持つ単なるベクトルです

> x <- 1
> y <- as.matrix(x)
> .Internal( inspect(x) )
@7f81a6c80568 14 REALSXP g0c1 [MARK,NAM(2)] (len=1, tl=0) 1 ## data
> .Internal( inspect(y) )
@7f81a3ea86c8 14 REALSXP g0c1 [NAM(2),ATT] (len=1, tl=0) 1 ## data
ATTRIB:
  @7f81a3e68e08 02 LISTSXP g0c0 [] 
    TAG: @7f81a30013f8 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value) 
    @7f81a3ea8668 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1

xとの「データ」コンポーネントyが単なるs であることに注意してください。ただし、行列にREALSXPは​​この余分なコンポーネントがあります。これを使用すると、 aを の行列にdim簡単に変換できます。NumericVectorRcpp

(注: 以下の例では、SEXP型間の変換が明示的になるように、属性で使用しています):

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
SEXP vec_to_mat(SEXP x_) {
  std::vector<double> x = as< std::vector<double> >(x_);
  /* ... do something with x ... */
  NumericVector output = wrap(x);
  output.attr("dim") = Dimension(x.size(), 1);
  return output;
}

/*** R
m <- c(1, 2, 3)
vec_to_mat(m)
*/

私にくれます

> m <- c(1, 2, 3)

> vec_to_mat(m)
     [,1]
[1,]    1
[2,]    2
[3,]    3

したがって、Dimensionクラスを使用しdimてベクトルの属性に割り当てて、Rcpp で行列を「手動で」作成できます。

于 2013-11-08T19:23:38.217 に答える
16

あなたは良いアプローチを選びました。OpenMP のコンテキストでは、シングルスレッドの R から離れなければなりません。それstd::vectorは良いことです。

はい、通常のandコンバーターだけでなく、 std::vectortoRcpp::NumericVectorおよびRcpp::NumericMatrix(これは結局は次元属性を持つ単なるベクトルです)からのコンストラクターとバリアントがあります。Rcoo:Integer*as<>wrap

Rcpp 単体テスト、Rcpp の例、そしてもちろんRcpp ギャラリーサイトには、たくさんの例があります。

編集:これは非常に単純な例です:

 R> cppFunction('NumericVector phil(int n) { std::vector<double> x(n);
 +              return wrap(x); }') 
 R> phil(4)  
 [1] 0 0 0 0    
 R>    
于 2013-11-08T16:52:57.580 に答える