2017-07-16 19 views
1

Ich habe eine Digitalisierungsfunktion auf RCPP:RCPP Matrix Digitalisierungs

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; 
} 

die Funktion gut funktioniert. Allerdings in R, wenn ich zwei Matrizen (M und m) durch M = m. Wenn ich den einen binär bin, ist der andere ebenfalls binarisiert.

Warum sind die Objekte abhängig? Und wie kann ich das auflösen?

+3

Warum sich mit Rcpp beschäftigen? m [] <- as.logical (m) würde die Aufgabe sehr effizient erledigen. – Roland

Antwort

3

Sie erstellen eine flache Kopie des Objekts. Probieren Sie den folgenden Code aus und schauen Sie sich die Konsolenausgabe an.

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

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

Die Ausgabe sieht wie folgt aus:

> 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>" 

Das m2 Objekt eine andere Stelle im Speicher hat. Hoffe das hilft!

+1

Richtig! Rcpp verwendet flache Kopien über Proxy-Objekte. Verwende 'Rcpp :: NumericMatrix m2 = Rcpp :: clone (m);' und weise 'm2' zu, wenn du' m' unverändert lassen möchtest. –

+0

Ok! vielen Dank. – Bas