combinatorics again

Robin Hankin r.hankin at noc.soton.ac.uk
Mon Mar 6 10:06:36 CET 2006


Hi

I want to enumerate all vectors of length "J", whose elements are
integers in the range 1 to S, without regard to ordering.

With J=S=3, the combinations are as follows:


        [,1] [,2] [,3]
  [1,]    1    1    1
  [2,]    1    1    2
  [3,]    1    1    3
  [4,]    1    2    2
  [5,]    1    2    3
  [6,]    1    3    3
  [7,]    2    2    2
  [8,]    2    2    3
  [9,]    2    3    3
[10,]    3    3    3


Note that (eg) c(1,2,1) is not on the list because we already have
c(1,1,2) which would be equivalent [because the problem is to
enumerate the cases without regard to ordering] and I do not want
repeats.

The best I can do is to create all S^J possibilities and weed out the
repeats, using unique() ; code below.

Why is this no good?  Well, even for the tiny case of J=S=10, this
would require a matrix of 10^10 rows, and my little linux machine
refuses to cooperate, complaining about allocating a vector of
length 1410065408.  For these values of J and S, I happen to know
that the are 6360 distinct combinations, which is eminently handleable.


Anyone got any better ideas?






allcomb <- function(J,S){

   f <- function(...) {
     1:S
   }
   out <- as.matrix(do.call("expand.grid", lapply(1:J, FUN = f)))
   out <- t(apply(out,1,sort))
   unique(out)
}


--
Robin Hankin
Uncertainty Analyst
National Oceanography Centre, Southampton
European Way, Southampton SO14 3ZH, UK
  tel  023-8059-7743






More information about the R-help mailing list