2012-09-24 26 views
6

Estoy tratando de asignar una matriz 1D a una matriz 3D usando la lista proporcionada de dimensiones.Construir una matriz 3D en Rcpp

Éstos son mis componentes:

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()); 

Lo que no me averiguar es cómo puedo crear un NumericVector que tendría tanto mis datos y las dimensiones deseadas.

+1

Ejemplo con * RcppArmadillo cubo *: http://markovjumps.blogspot.be/2011/12/r-array-to-rcpparmadillo-cube.html –

Respuesta

5

Es factible, pero un poco doloroso. Supongo que se agradecerá una contribución decente (y probada) para el nuevo constructor o la función auxiliar.

Mientras tanto, puede hacer lo que hace el ejemplo a continuación. Pero tenga cuidado con row-major y col-major, etc. Otra opción es RcppArmadillo, que tiene una matriz de generalización tipo "Cube" adecuada para 3-d.

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> 
+0

acuerdo con el constructor new, habría muy útil. Puedo investigarlo cuando comprenda cómo funcionan las cosas en Rcpp. – Datageek

+1

FWIW, agregar otro constructor a la ya inflada plantilla 'Vector' parece una mala idea. Puede lograr lo mismo con una función gratuita, o una clase Array dedicada, como la de Rcpp11. –

+2

Gracias por actualizar una respuesta de dos años. FWIW He estado usando RcppArmadillo en varias ocasiones ya que Armadillo tiene 'Cube' como un objeto de primera clase. Funciona para mi. –

10

Existe una solución más corta. Puede remodelar sus datos usando .attr. Los datos se pueden crear o dar como entrada; no importa. Ver más abajo:

library("Rcpp") 

cppFunction(code=' 
NumericVector arrayC(NumericVector input, IntegerVector dim) { 
    input.attr("dim") = dim; 
    return input; 
} 
') 
x = 1:8 
arrayC(x, c(2,2,2)) 
## , , 1 
## 
##  [,1] [,2] 
## [1,] 1 3 
## [2,] 2 4 
## 
## , , 2 
## 
##  [,1] [,2] 
## [1,] 5 7 
## [2,] 6 8 
Cuestiones relacionadas