RCPP返回相同的矩阵

时间:2019-01-17 14:07:31

标签: r rcpp

我的Rcpp函数返回相同的结果。在此函数中,我更改了一些 studyClones 数字,但是当我取结果时,我具有相同的矩阵studyClones。 我做错了什么?

Rcpp代码:

  NumericMatrix myFunction(NumericMatrix study, NumericMatrix numMatrix, double coef){
  int ind = 0;
  int sizeImage = study.rows();
  NumericVector randomNumbers;
  for(int i=0; i<numMatrix.rows(); i++){
    for(int j=ind; j<(numMatrix(i,0)+ind); j++){
      randomNumbers = sample(sizeImage, ceil(numMatrix(i,0)*coef), false);
      for(int k=0; k<randomNumbers.length(); k++){
        if(study(randomNumbers[k],j)==1){
          study[randomNumbers[k],j] = 0;
        }else{
          study[randomNumbers[k],j] = 1;
        }
      }
    }
    ind += numMatrix(i,0);
  }
 return study;
}

R代码:

result <- myFunction(studyMatrix, numericMatrix, coefficienM)
all(result==studyMatrix)
[1] TRUE

1 个答案:

答案 0 :(得分:4)

您所做的错是,您错过了study(大约)是原始R数据的指针。在C ++级别修改study时,您修改的是原始矩阵而不是副本。这样,R对象studyMatrix就被修改了,您也将其返回。因此,基本上resultstudyMatrix都是在内存中修改的同一原始对象。因此它们是平等的。

尝试以下代码以了解:

void f(NumericMatrix M)
{
  M(0,0) = 0;
  return;
}

然后用R

m = matrix(1, 2,2)
m
#>      [,1] [,2]
#> [1,]    1    1
#> [2,]    1    1
f(m)
m
#>      [,1] [,2]
#> [1,]    0    1
#> [2,]    1    1

要解决您的问题,您可以使用clone

NumericMatrix f(NumericMatrix M)
{
  NumericMatrix MM = clone(M);
  MM(0,0) = 0;
  return MM;
}