【发布时间】:2016-02-16 18:05:42
【问题描述】:
我正在运行来自http://markovjumps.blogspot.com/2011/12/r-array-to-rcpparmadillo-cube.html 的以下示例代码,它说明了如何将 R 数组转换为 RcppArmadillo 立方体。代码如下
require(inline)
require(RcppArmadillo)
src <- '
using namespace Rcpp;
NumericVector vecArray(myArray);
IntegerVector arrayDims = vecArray.attr("dim");
arma::cube cubeArray(vecArray.begin(), arrayDims[0], arrayDims[1], arrayDims[2], false);
//change one element in the array/cube
cubeArray(0,0,0) = 518;
return(wrap(cubeArray));
'
readCube = cxxfunction(signature(myArray="numeric"),body=src, plugin="RcppArmadillo")
set.seed(345)
testArray = array(rnorm(8), dim=c(2,2,2))
print(testArray[1,1,1])
# -0.7849082
readCube(testArray)[1,1,1]
# 518
print(testArray)[1,1,1]
# 518
可以看出,testArray 已被更改。但是,我不太明白为什么会发生这种情况。
我对该问题进行了一些搜索,并在http://arma.sourceforge.net/docs.html#Cube 中发现“使用可写辅助(外部)内存中的数据创建多维数据集,其中 ptr_aux_mem 是指向内存的指针。默认情况下,多维数据集分配自己的内存并复制辅助内存中的数据(为了安全)。但是,如果将 copy_aux_mem 设置为 false,则多维数据集将直接使用辅助内存(即不复制);这更快,但除非您知道自己在做什么,否则可能很危险!”
所以我将 false 更改为 true,问题就消失了。但是,我仍然感到困惑,因为原始代码创建了一个新的 NumericVector vecArray 并且 vecArray.begin() 应该引用该新 NumericVector 对象的内存,而不是函数输入 myArray。我觉得改变 cubeArray 应该只改变 vecArray 而不是 myArray。
【问题讨论】:
-
您可能想了解
clone(),例如:stackoverflow.com/questions/11300048/… -
谢谢!这完美地回答了我的问题。
-
我建议将您的解决方案作为答案发布,而不是编辑问题。