2015-01-07 25 views
9

n > 2 uzunluğundaki ikili bir vektörün olası tüm kombinasyonlarını oluşturmak için 1 ' satırdaki s 2.01 veya 2 "1" s uzunluğundaki bir ikili vektörün olası tüm kombinasyonlarını yaratın

n=4, cevap olurdu:

0 0 0 0 
0 0 0 1 
0 0 1 0 
0 0 1 1 
0 1 0 0 
0 1 0 1 
0 1 1 0 
1 0 0 0 
1 0 0 1 
1 0 1 0 
1 1 0 0 

Bu işler ancak büyük (n> 20) n alır gibi yoğun ve yavaş çok bellek alır:

n <- 4 
m <- expand.grid(rep(list(0:1),n)) 
m <- m[rowSums(m)<3,] 
Örneğin

Bunu daha verimli bir şekilde nasıl yapabilirim?

Yanıt: Marat Talipov en ve akrun çözümleri kombinasyonuna göre
*

n=4 
z=rep(0,n) 
rbind(unname(z), t(combn(0:n,2, FUN=function(k) {z[k]=1;z}))) 
+0

@akrun Sorunum, n'nin büyüdükçe, 'expand.grid' gereksiz yere sonraki adımda kaldırılacak satırlar oluşturması olduğunu düşünüyorum. Tercihen, bu vektörler ilk sırada oluşturulmayacaktır. – verigolfer

+2

Yeni başlayanlar için, "Azalt (" + ", m)", birkaç satır için 'rowSums (m)' –

+0

'dan çok daha etkilidir;) kütüphane (çoklu); n <- 10; nn <- 1: n; m <- contrMat (nn, type = "Tukey"); m [m == - 1] = 1 – ckluss

cevap

5

Bu algoritma olabilir expand.grid göre daha fazla etkili olduğu olması:

n <- 3 
z <- rep(0,n) 

answer <- t(apply(combn(0:n,2),2,function(k) {z[k]=1;z})) 
#  [,1] [,2] [,3] 
# [1,] 1 0 0 
# [2,] 0 1 0 
# [3,] 0 0 1 
# [4,] 1 1 0 
# [5,] 1 0 1 
# [6,] 0 1 1 

[DÜZENLEME ] Orijinal çözümümün kolayca sıfırlanabilen sıfırlar, önemsiz bir durumun eksik olduğunu fark ettim:

rbind(unname(z),answer) 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 0 
# [2,] 1 0 0 0 
# [3,] 0 1 0 0 
# [4,] 0 0 1 0 
# [5,] 0 0 0 1 
# [6,] 1 1 0 0 
# [7,] 1 0 1 0 
# [8,] 1 0 0 1 
# [9,] 0 1 1 0 
# [10,] 0 1 0 1 
# [11,] 0 0 1 1 
+0

. Bunu n = 30 ile denedim ve çok güzel çalıştı. Yöntemim, R oturumumu n = 30 ile çarptı. – verigolfer

İlgili konular