[R] combinatorial programming problem
Kjetil Brinchmann Halvorsen
kjetilbrinchmannhalvorsen at gmail.com
Fri May 26 18:58:48 CEST 2006
Hola!
I am programming a class (S3) "symarray" for
storing the results of functions symmetric in its
k arguments. Intended use is for association indices
for more than two variables, for instance coresistivity
against antibiotics.
There is one programming problem I haven't solved, making an inverse
of the index function indx() --- se code below. It could for instance
return the original k indexes in strictly increasing order, to make
indx() formally invertible.
Any ideas?
Kjetil
Code:
# Implementing an S3 class for symarrays with array rank r for dimension
# [k, k, ..., k] with k>=r repeated r times. We do not store the diagonal.
# Storage requirement is given by {r, k}= choose(k, r)
# where r=array rank, k=maximum index
symarray <- function(data=NA, dims=c(1,1)){
r <- dims[1]
k <- dims[2]
if(r > k) stop("symarray needs dimension larger than array rank")
len <- choose(k, r)
out <- data[1:len]
attr(out, "dims") <- dims
class(out) <- "symarray"
out
}
# Index calculation:
indx <- function(inds, k){
r <- length(inds)
if(r==1) return(inds) else {
if(inds[1]==1) {
return( indx(inds[-1]-1, k-1 ) ) } else {
return( indx(c(inds[1]-1, seq(from=k-r+2, by=1, to=k)), k) +
indx( inds[-1]-inds[1], k-inds[1] ))
}
}
} # end indx
# Methods for assignment and indexing:
"[.symarray" <- function(x, inds, drop=FALSE){
dims <- attr(x, "dims")
k <- dims[2]
inds <- indx(inds, k)
res <- NextMethod("[", x)
res
}
"[<-.symarray" <- function(x, inds, value){
dims <- attr(x, "dims")
k <- dims[2]
inds <- indx(inds, k)
res <- NextMethod("[<-", x)
res
}
More information about the R-help
mailing list