# 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

```