2017-07-16 66 views
1

我在做RCPP二值化功能:RCPP矩阵二值化

NumericMatrix binarize_matrix(NumericMatrix m){ 
int ncol=m.ncol(); 
for(int i=0; i<ncol; i++){ 
for(int j=0;j<ncol;j++){ 
    if(m(j,i)>1) 
    m(j,i)=1; 
} 
} 
return m; 
} 

功能效果很好。 但是,在R中,当我通过M = m创建两个矩阵(M和m)时。当我二进制化时,另一个也被二进制化。

为什么这些对象是相关的?我该如何解决这个问题?

+3

为什么要打扰Rcpp? m [] < - as.logical(m)将非常有效地完成工作。 – Roland

回答

3

您正在制作对象的浅表副本。尝试下面的代码并查看控制台输出。

M = data.frame(a=c(1,2)) 
m = M 
tracemem(m) 
tracemem(M) 

m2 <- data.frame(M) 
tracemem(m2) 

输出看起来像这样:

> M = data.frame(a=c(1,2)) 
> m = M 
> tracemem(m) 
[1] "<0x6b9d028>" 
> tracemem(M) 
[1] "<0x6b9d028>" 
> 
> m2 <- data.frame(M) 
> tracemem(m2) 
[1] "<0x6b9aea8>" 

的平方米对象在存储器的不同位置。希望这可以帮助!

+1

正确! Rcpp通过代理对象使用浅拷贝。使用'Rcpp :: NumericMatrix m2 = Rcpp :: clone(m);'并将'm2'分配给'm2',如果你想'm'不变。 –

+0

好的!非常感谢你。 – Bas