Dieses kleine Problem ist der Flaschenhals eines großen Codes, der mindestens tausend Mal wiederholt werden muss, so dass das Hauptproblem hier die Geschwindigkeit ist.Beschleunigen Comb auf ID-Matrix R
Ich habe einen Vektor von Zahlen, zum Beispiel:
v <- c(1,3,5)
ich alle Kombinationen wissen, mag ich mit dieser Untergruppe machen. Und stellt sie in einer Matrix von 0 und 1 ist zum Beispiel:
col1 col2 col3 col4 col5 col6 col7
1 1 0 0 1 1 0 1
3 0 1 0 1 0 1 1
5 0 0 1 0 1 1 1
Eigentlich die Funktion combn Ich verwende (ich glaube, der schnellste Weg ist, sie sauber zu tun, nicht wahr?)
matrix <- lapply(seq(length(v)),function(i){
submatrix <- combn(x = 1:length(v), m=i)
#code follows after a brief explanation
ich würde erhalten drei Matrizes wie:
1 2 3
1 1 2
2 3 3
1
2
3
So die 1 und 0-Matrix ich es mit einem Doppel füllen aufstehen für. (Hier ist, wo ich wahrscheinlich etwas Geschwindigkeit aufstehen konnte)
list_matrix <- lapply(seq(length(v)),function(i){
submatrix <- combn(x = 1:length(v), m=i)
1matrix <- matrix(data = 0, nrow = length(v), ncol = dim(submatrix)[2])
for(k in seq(dim(submatrix)[2]))
for(j in seq(dim(submatrix)[1]))
1matrix[submatrix[j,k],k] <- 1
return(1matrix) })
Was ich gezeigt habe, ist der langsamste Teil des Codes. Für dieses Beispiel werden ca. 0,012 s benötigt. Der nächste Schritt ist einfach.
Was ich habe, ist, drei Matrices bekommen:
col1 col2 col3
1 1 0 0
3 0 1 0
5 0 0 1
col1 col2 col3
1 1 1 0
3 1 0 1
5 0 1 1
col1
1 1
3 1
5 1
nun der Prozess ist ganz einfach und schnell.
final_matrix <- list_matrix[[1]]
for(i in seq(2,length(list_matrix))
final_matrix <- cbind(final_matrix, list_matrix[[i]]
Und was tut, ist die Spalten einfügen zu erhalten. Es dauert 0,0033 s:
col1 col2 col3 col4 col5 col6 col7
1 1 0 0 1 1 0 1
3 0 1 0 1 0 1 1
5 0 0 1 0 1 1 1
Ich muss diesen Prozess beschleunigen. Ich denke, dass das Doppelte für oder das Plätschern dies verlangsamt. Wenn jemand etwas Hilfe schreiben könnte, würde ich es zu schätzen wissen.
Vielen Dank.
Es scheint, dass Sie auch "? Expand.grid" verwenden könnten, wenn es zu Ihrem allgemeinen Problem passt. 't (expand.grid (rep_len (Liste (0: 1), Länge (v)))) [, -1]' –
Ich denke, es könnte funktionieren. Vielen Dank. –