# [R] Matrix problem - possibly use of 'outer'

David Orme d.orme at imperial.ac.uk
Wed Sep 3 14:00:37 CEST 2003

```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

```