Hi, I can't get my head around this - can someone give me a pointer: I have a vector of values ('orig') representing areas and I want to calculate the amount contributed by each original vector values in a new vector ('new'). I find this hard to explain so here is a graphical explanation: # CODE START orig <- 10:1 #10 values with varying area new <- rep(sum(orig)/6,6) #6 values with equal areas plot(56:0, 56:0, type="n", xlim=c(56,0)) # suitable plot frame abline(v=cumsum(c(0,new)), col="grey75") # the original values axis(1, at=cumsum(0:10), line=-5) # the 'breaks' for the new vector # CODE STOP The grey lines show how area from the vector 'orig' should fall into the vector 'new'. I want to represent this relationship as a transformation matrix (transf.mat) of dimensions length(new) x length(orig) such that each element in the matrix represents the shared areas between the vectors. colSums(transf.mat) therefore is identical to orig and rowSums is identical to new. I've worked transf.mat out by hand for the example above but I need to find a way of computing it given the two vectors orig and new - my hunch is that there is some elegant way using outer but I can't work it out. # CODE START transf.mat <- matrix(c(9.167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.833, 8.333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.666, 8, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.5, 2.667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.333, 5, 0.833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.167, 3, 2, 1), ncol=10, byrow=T) all.equal(colSums(transf.mat), orig) all.equal(rowSums(transf.mat), new) # CODE STOP Hope this makes some sense. David --------------------------------------- Dr. David Orme Department of Biological Sciences Imperial College London Silwood Park Campus Ascot, Berkshire SL5 7PY UK. Tel: +44 (0)20 759 42358 Fax: +44 (0)20 759 42339 e-mail: d.orme at imperial.ac.uk