2017-07-16 47 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