12

提供された次元のリストを使用して、1D 配列を 3D 配列にマップしようとしています。

ここに私のコンポーネントがあります:

SEXP data; // my 1D array
// I can initialise new 3D vector in the following way:
NumericVector vector(Dimension(2, 2, 2);
// or the following:
NumericVector vector(data.begin(), data.end());

私が理解できなかったのは、データと目的の次元の両方を持つ NumericVector を作成する方法です。

4

2 に答える 2

5

実行可能ですが、少し痛いです。新しいコンストラクターまたはヘルパー関数に対するまともな (そしてテスト済みの) 貢献をいただければ幸いです。

それまでの間、以下の例が行うことを行うことができます。ただし、行優先度や列優先度などには注意してください。もう 1 つのオプションは、行列を 3 次元に一般化する適切な「キューブ」型を持つRcppArmadilloです。

R> library(inline)
R> fx <- cxxfunction(signature(vs="numeric", ds="integer"), plugin="Rcpp", body='
+    Rcpp::NumericVector v(vs);            // get the data
+    Rcpp::Dimension d(ds);                // get the dim object
+    Rcpp::NumericVector r(d);             // create vec. with correct dims
+    std::copy(v.begin(), v.end(), r.begin());  // and copy
+    return Rcpp::List::create(v, d, r);
+ ')
R> fx(1:8, c(2,2,2))
[[1]]
[1] 1 2 3 4 5 6 7 8

[[2]]
[1] 2 2 2

[[3]]
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8


R>
于 2012-09-24T18:42:15.413 に答える