2017-07-16 5 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の2つの行列(Mとm)を作成します。私が2値化するともう一方も2値化されます。

なぜオブジェクトが依存するのですか?そして私はこれをどのように解決できますか?

+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は、プロキシオブジェクト経由で浅いコピーを使用します。 'm'を変更しない場合は' Rcpp :: NumericMatrix m2 = Rcpp :: clone(m); 'を使い、' m2'に代入します。 –

+0

どうもありがとうございました。 – Bas