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