包装arma::Mat时如何避免深度复制<;双倍>;到Rcpp::NumericMatrix
但问题是,如何让R/Rcpp接管“ptr”,以便直接从现有内存构建NumericMatrix?我们实际上是在第三次实现犰狳如何获取R对象,而且不应该很昂贵。请参阅包装arma::Mat时如何避免深度复制<;双倍>;到Rcpp::NumericMatrix,r,rcpp,rcpparmadillo,R,Rcpp,Rcpparmadillo,但问题是,如何让R/Rcpp接管“ptr”,以便直接从现有内存构建NumericMatrix?我们实际上是在第三次实现犰狳如何获取R对象,而且不应该很昂贵。请参阅inst/examples/中的一些计时练习,也许可以在您的终端尝试一些。在进入的过程中,我们清楚地使用了advancend构造函数Arma。在这里,我认为,我们需要分配确保R的分配器得到使用,然后代理Armadillo返回R对象的工作。请参阅@Dirk使用R分配和使用Armadillo的高级构造函数的想法的实现。推理是完全不同的,所以
inst/examples/
中的一些计时练习,也许可以在您的终端尝试一些。在进入的过程中,我们清楚地使用了advancend构造函数Arma。在这里,我认为,我们需要分配确保R的分配器得到使用,然后代理Armadillo返回R对象的工作。请参阅@Dirk使用R分配和使用Armadillo的高级构造函数的想法的实现。推理是完全不同的,所以从我的观点来看没有重复…那么,除非我遗漏了什么,为什么不创建对象作为Rcpp::numerimatrix
,然后使用高级构造函数创建arma::mat
对象,以便在整个函数中对la@RalfStubner的链接答案进行操作,然后,您可以在末尾返回原始的Rcpp::numerimatrix
对象。我想这就是德克和拉尔夫suggesting@duckmayr据我所知,在调用外部函数之前,Mike不知道矩阵的大小,因此不可能让R分配所需的内存。我担心在这种情况下没有办法复制数据。而且,memcpy
很便宜。正如丹尼尔·莱米尔(Daniel Lemire)昨天在博客中所说()分配可能不是,但对于我们的科学工作负载来说,这会成为瓶颈吗?如果是的话(比如说,蒙特卡罗运行),你可以预先分配块……我们已经有效地实现了犰狳如何获得R对象的第三次实现,而且应该不会很昂贵。请参阅inst/examples/
中的一些计时练习,也许可以在您的终端尝试一些。在进入的过程中,我们清楚地使用了advancend构造函数Arma。在这里,我认为,我们需要分配确保R的分配器得到使用,然后代理Armadillo返回R对象的工作。请参阅@Dirk使用R分配和使用Armadillo的高级构造函数的想法的实现。推理是完全不同的,所以从我的观点来看没有重复…那么,除非我遗漏了什么,为什么不创建对象作为Rcpp::numerimatrix
,然后使用高级构造函数创建arma::mat
对象,以便在整个函数中对la@RalfStubner的链接答案进行操作,然后,您可以在末尾返回原始的Rcpp::numerimatrix
对象。我想这就是德克和拉尔夫suggesting@duckmayr据我所知,在调用外部函数之前,Mike不知道矩阵的大小,因此不可能让R分配所需的内存。我担心在这种情况下没有办法复制数据。而且,memcpy
很便宜。正如丹尼尔·莱米尔(Daniel Lemire)昨天在博客中所说()分配可能不是,但对于我们的科学工作负载来说,这会成为瓶颈吗?如果是的话(比如说蒙特卡罗),你可以预先分配块。。。
NumericMatrix res = wrap(mat);// mat is an existing arma::Mat<double>
double * ptr = mat.memptr();
access::rw(mat.mem) = 0;