# [R] Elegant way to subtract matrix from array

Gavin Simpson gavin.simpson at ucl.ac.uk
Wed Jul 27 10:42:09 CEST 2011

```On Wed, 2011-07-27 at 01:06 -0700, steven mosher wrote:
> there are really two related problems here
>
> I have a 2D matrix
>
>
> A <- matrix(1:100,nrow=20,ncol =5)
>
>
> S <- matrix(1:10,nrow=2,ncol =5)
>
>
> #I want to subtract S from A. so that S would be subtracted from the
> first 2 rows of
>
> #A, then the next two rows and so on.

For this one, I have used the following trick to replication a matrix

do.call(rbind, rep(list(mat), N)

where we convert the matrix, `mat`, to a list and repeat that list `N`
times, and arrange for the resulting list to be rbind-ed. For your
example matrices, the following does what you want:

A - do.call(rbind, rep(list(S), nrow(A)/nrow(S)))

Whether this is useful will depend on the dimension of A and S - from
your posts on R-Bloggers, I can well imagine you are dealing with large
matrices.

> #I have a the same problem with a 3D array
>
> # where I want to subtract Q for every layer (1-10) in Z
>
> # I thought I solved this one with  array(mapply("-",Z,Q),dim=dim(Z))
>
> # but got the wrong answers
>
>
> Z <- array(1:100,dim=c(2,5,10))
>
> Q <- matrix(1:10,nrow=2,ncol =5)

For this one, consider the often overlooked function `sweep()`:

sweep(Z, c(1,2), Q, "-")

does what you wanted. c(1,2) is the `MARGIN` argument over the
dimensions that Q will be swept from.

HTH

G

--
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
Dr. Gavin Simpson             [t] +44 (0)20 7679 0522
ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
Pearson Building,             [e] gavin.simpsonATNOSPAMucl.ac.uk
Gower Street, London          [w] http://www.ucl.ac.uk/~ucfagls/
UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%

```

More information about the R-help mailing list