我的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
答案 0 :(得分:4)
您所做的错是,您错过了study
(大约)是原始R数据的指针。在C ++级别修改study
时,您修改的是原始矩阵而不是副本。这样,R对象studyMatrix
就被修改了,您也将其返回。因此,基本上result
和studyMatrix
都是在内存中修改的同一原始对象。因此它们是平等的。
尝试以下代码以了解:
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;
}