2016-05-13 7 views
1

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.

+2

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]' –

+0

Ich denke, es könnte funktionieren. Vielen Dank. –

Antwort

1

Sie könnten die Verwendung von tabulate machen Sie Ihren Code zu vereinfachen:

L <- sapply(1:length(v), function(i) combn(length(v),i,FUN=tabulate,nbins=length(v))) 
do.call(cbind,L) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
#[1,] 1 0 0 1 1 0 1 
#[2,] 0 1 0 1 0 1 1 
#[3,] 0 0 1 0 1 1 1 

Beachten Sie, dass combn sich langsam, so dass Sie seine schnellere Analoga erkunden möchten vielleicht, siehe z.B. Faster version of combn

+0

Ich werde es überprüfen. Vielen Dank. –