2016-04-25 9 views
3

Ich möchte ein arma::vec Objekt nehmen und es zu einem arma::cube Objekt umformen.Armadillo von Vektor zu Würfel umformen

Zum Beispiel:

vec param(mm*n*g); 
param.randn(); 
cube LL = reshape(param,mm,n,g); // this line doesn't work 

Der einfachste Weg, ich dies Arbeit bekommen kann, ist:

paramtemp = as<NumericVector>(wrap(param)); 
cube LL(paramtemp.begin(),mm,n,g); 

Aber sicher gibt es eine elegantere Möglichkeit?

Antwort

2

Viele Armadillo-Klassen bieten Konstruktoren, die ein Argument als Zeiger auf einen anderen Speicherort verwenden. im Allgemeinen wird dies ein begin Iterator eines anderen Objekts sein. Zum Beispiel

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

// [[Rcpp::export]] 
arma::cube to_cube(int x, int y, int z) { 
    arma::vec v(x * y * z); 
    v.randn(); 

    arma::cube res((const double*)v.begin(), x, y, z); 
    return res; 
} 

/***R 

to_cube(3, 3, 3) 
# , , 1 
# 
#   [,1]  [,2]  [,3] 
# [1,] -0.8052190 0.5206867 0.4562287 
# [2,] 0.6407149 0.8247035 -0.2375103 
# [3,] -0.2766542 0.0527188 -1.2807390 
# 
# , , 2 
# 
#    [,1]  [,2]  [,3] 
# [1,] -0.49995982 0.7240956 0.66634699 
# [2,] 0.06367092 -0.7991327 -0.36003560 
# [3,] -0.90958952 -0.4431064 0.05952237 
# 
# , , 3 
# 
#   [,1]  [,2]  [,3] 
# [1,] 0.457159 1.6725911 -0.9299367 
# [2,] 1.205733 0.6185083 0.3805266 
# [3,] 0.545668 -0.4356577 -0.9111175 

*/ 

Ich bin mir nicht sicher, ob die Besetzung zu const double* unbedingt erforderlich ist, aber es ist da zwischen den folgenden zwei Konstrukteuren zu unterscheiden,

  • cube(const ptr_aux_mem, n_rows, n_cols, n_slices)
  • cube(ptr_aux_mem, n_rows, n_cols, n_slices, copy_aux_mem = true, strict = false)

wo die erste (die ist die Absicht oben) ist eine schreibgeschützte Kopie.