2016-04-25 23 views
3

arma::vecオブジェクトを取り出し、arma::cubeオブジェクトに再整形したいと思います。例えばアルマジロのベクトルからキューブへの変更

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

しかし確実に、よりエレガントな方法があります:私は仕事にこれを取得することができ

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

最も簡単な方法はありますか?

答えて

2

多くのアルマジロクラスは、別のメモリ位置へのポインタである引数を取るコンストラクタを提供します。一般的にこれは別のオブジェクトのbeginイテレータになります。例えば、

// [[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 

*/ 

私はconst double*へのキャストは、厳密には必要であるかどうかわからないんだけど、それは、次の2つのコンストラクタを区別することがあり、

  • 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)

ここで、最初の上記の意図)は読み取り専用コピーです。

関連する問題