我想获取一个 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 类提供构造函数,它们接受一个参数,该参数是指向另一个内存位置的指针;通常这将是另一个对象的 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* 的强制转换是否是绝对必要的,但它可以区分以下两个构造函数,
  • 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)

  • 其中第一个(这是上面的意图)是只读副本。

    关于r - Armadillo 从矢量重塑为立方体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36844445/

    10-12 17:14