Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 犰狳从矢量重塑为立方体_R_Rcpp_Armadillo - Fatal编程技术网

R 犰狳从矢量重塑为立方体

R 犰狳从矢量重塑为立方体,r,rcpp,armadillo,R,Rcpp,Armadillo,我想要一个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); paramtemp=as(w

我想要一个
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); 
paramtemp=as(wrap(param));
立方体LL(参数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

*/
/[[Rcpp::depends(RcppArmadillo)]]
#包括
//[[Rcpp::导出]]
arma::立方体到_立方体(intx,inty,intz){
arma::vecv(x*y*z);
v、 randn();
arma::立方体res((常数双*)v.begin(),x,y,z);
返回res;
}
/***R
到_立方体(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
*/

我不确定强制转换为
constdouble*
是否严格必要,但它是用来区分以下两个构造函数的

  • cube(常量ptr\u aux\u mem,n行,n列,n片)
  • cube(ptr\u aux\u mem,n行,n列,n片,copy\u aux\u mem=true,strict=false)
其中第一个(即上述意图)为只读副本