2017-05-07 1 views
1

Ich habe eine große Matrix (500-Reihe von 30000-Spalte) von Nullen und Einsen. Dazu habe ich Zeile 501 mit Werten zwischen 0 und 1 angehängt. Wenn der Wert in Zeile 501 für Spalte x> 0,5 ist, möchte ich alle Nullen durch Einsen und alle Einsen durch Nullen in dieser Spalte ersetzen. Ich habe den Code unten implementiert:Wie ersetzt man Elemente in bestimmten Spalten einer Matrix?

for(x in 1:30000){ 
    if (matrix[501,x] > 0.5){ 
    for(y in 1:500){ 
     matrix[matrix[y,x]==1] <- 0 
     matrix[matrix[y,x]==0] <- 1 
    } 
    } 
} 
matrix 

Dieser Code läuft kontinuierlich, und ich habe vor dem Anhalten es so lange wie 2 Stunden weg, so dass ich nicht eine Fehlermeldung zu berichten. Wie kann ich das aufräumen? Was mache ich falsch?

+0

Sie O (n^2) -Algorithmus verwenden, zusätzlich ist Schleife sehr langsam in r. Lesen Sie diesen Artikel http://bigocheatsheet.com/. Dies gibt Ihnen einen Einblick, wie Sie Ihren Code umschreiben können. –

+1

Beachten Sie auch, dass Ihre erste Ersatzlinie durch Ihre zweite Ersatzlinie rückgängig gemacht wird. – lmo

+0

Danke lmo und Kppatel. Hätte nicht gedacht, dass ich vielleicht in einer Ersatzschleife stecke. – Dirigible

Antwort

3

Sie können 0 -> 1 und 1 -> 0 zusammen spiegeln, indem Sie x <- 1 - x verwenden.

So würde man

toFlip <- matrix[501,] > 0.5 
matrix[1:500, toFlip] <- 1 - matrix[1:500,toFlip] 
+0

Auch '! Matrix [1: 500, toFlip]' funktioniert ('! X' dreht 0 zu 1 und umgekehrt). – nicola

+0

Ich denke, es hängt davon ab, ob Sie eine Zahl oder einen booleschen Wert wünschen. –

Verwandte Themen