我想采用arma :: vec对象并将其重塑为arma :: cube对象.
例如:
vec param(mm*n*g);
param.randn();
cube LL = reshape(param,mm,n,g); // this line doesn't work
我能让它工作的最简单方法是:
paramtemp = as<NumericVector>(wrap(param));
cube LL(paramtemp.begin(),mm,n,g);
但肯定有更优雅的方式吗?
最佳答案 许多Armadillo类提供构造函数,这些构造函数接受一个指向另一个内存位置的参数;通常这将是另一个对象的开始迭代器.例如,
// [[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 *是否是严格必要的,但是它可以区分以下两个构造函数,
> 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)
第一个(上面的意图)是一个只读副本.