From: Mark Payne <mpa_at_difres.dk>

Date: Mon, 30 Apr 2007 13:41:13 +0200

if(length(target.dim)!=length(dim.balloon)) { stop("Input array does not have the same dimensionality as indicated in target.dim.") }

#Identify the dimensions along which to inflate the array

#Create temp array of 1s

inflated.balloon <- array(1,dim=target.dim) #And inflate using sweep

inflated.balloon <- sweep(inflated.balloon, corresponding.dims, balloon, "*") #Return results

return(inflated.balloon)

}

R-help_at_stat.math.ethz.ch mailing list

https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Mon 30 Apr 2007 - 16:09:44 GMT

Date: Mon, 30 Apr 2007 13:41:13 +0200

Gudday,

Robin's reply obviously set something in motion in my brain, because I woke up with the answer on Saturday morning (which was actually pretty frustrating because I had to wait until Monday morning to try it out!) - essentially create a dummy array of 1s, and then use sweep to fill it out... Here's my code for the general solution...

### FnInflate ### ииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииии #Inflates an input array of arbitray size along the necessary dimensions to achieve the #same size as that in target.dim #balloon : array to be "inflated" #target.dim : final size of "balloon". NB target.dim and balloon must have the same NUMBER of dimensions... FnInflate <- function(balloon, target.dim) { #Check number of input dimensions dim.balloon <- dim(balloon)

if(length(target.dim)!=length(dim.balloon)) { stop("Input array does not have the same dimensionality as indicated in target.dim.") }

#Identify the dimensions along which to inflate the array

same.dims <- dim.balloon == target.dim #A boolean array indicating whether the arrays correspond in that dimension corresponding.dims <- (1:length(target.dim))[same.dims] #Dimensions that correspond between the target dim and the input array non.corresponding.dims <- (1:length(target.dim))[!same.dims] #Dimensions that do not correspond between the target dim and the input array#Check that the non-corresponding dimensions are all of size 1 in the input array - we don't know what to do if this is not the case if(prod(dim(balloon)[non.corresponding.dims] == 1)==FALSE) { stop("Input array not suitable for inflation as non-corresponding dimensions are not of size 1.") }

#Create temp array of 1s

inflated.balloon <- array(1,dim=target.dim) #And inflate using sweep

inflated.balloon <- sweep(inflated.balloon, corresponding.dims, balloon, "*") #Return results

return(inflated.balloon)

}

Here's an example of it in use, inflating f along dimensions 2 and 6 to give a result the same size as N.

> dim(f)

[1] 10 1 1 1 1 1

> dim(N)

[1] 10 25 1 1 1 6

> dim(FnInflate(f,dim(N)))

[1] 10 25 1 1 1 6

Its written to solve the general problem, as you see here. Note that it will throw its hands up in the air if you try to inflate a (5,1,1) array to a (10,1,1) array - it will only work for, for example, inflating (5,1,1) to (5,10,10).

Thanks to all for their comments.

Cheers,

Mark

> -----Original Message-----

*> From: Robin Hankin [mailto:r.hankin_at_noc.soton.ac.uk]
**> Sent: Friday, 27 April 2007 13:32
**> To: Robin Hankin
**> Cc: Mark Payne; r-help_at_stat.math.ethz.ch
**> Subject: Re: [R] Inflate/Expand/Resize an array
**>
**> [replying to myself]
**>
**> it might be better to use
**>
**> sweep(f,(1:6)[-2],m,"+")
**>
**> instead.
**>
**>
**>
**>
**> On 27 Apr 2007, at 11:56, Robin Hankin wrote:
**>
**> > Hi
**> >
**> >
**> > f.dims <- c(10,25,1,1,1,14)
**> > m.dims <- c(10, 1,1,1,1,14)
**> > f <- array(1:prod(f.dims),f.dims)
**> > m <- array(1:prod(m.dims),m.dims)
**> > jj <- do.call(abind,c(rep(list(m),25),along=2))
**> >
**> >
**> > Then
**> >
**> > f + jj
**> >
**> > will give you what you want.
**> >
**> >
**> > The more general problem is a bit harder, as you say....
**> >
**> >
**> > HTH
**> >
**> > rksh
**> >
**> >
**> > On 27 Apr 2007, at 10:41, Mark Payne wrote:
**> >
**> >> Gudday,
**> >>
**> >> I've had a good look everywhere trying to figure out how
**> to do this,
**> >> but I'm afraid I can seem to find an answer anywhere - maybe its
**> >> because I'm not using the right terms, or maybe its because I'm a
**> >> dummy. But unfortunately, I am not completely and utterly stuck.
**> >> Here's the
**> >> problem:
**> >>
**> >> I have two large, six dimensional arrays that I would like to add
**> >> together. Lets call them f and m. Their dimensions are
**> respectively:
**> >>
**> >>> dim(f)
**> >> [1] 10 25 1 1 1 14
**> >>> dim(m)
**> >> [1] 10 1 1 1 1 14
**> >>
**> >> You can see that they're pretty close in size, but not identical.
**> >> What I
**> >> would like to do is expand or inflate m along its second
**> dimension so
**> >> that it ends up with dimension 10 25 1 1 1 14, so that I
**> can then add
**> >> the two together - the new values created along that
**> second dimension
**> >> would simply be copies of the first value..
**> >>
**> >> What's the fastest way to do this? Is there a dedicated function?
**> >> Ideally I envisage something that you feed the input
**> array, and the
**> >> desired dimensions, and it does the rest for you. Please
**> also bear in
**> >> mind that this is a specific problem - the more general
**> case is where
**> >> I don't know which dimensions are "out of shape", so to speak...
**> >>
**> >> I hope that's clear, and that someone can me out here...
**> >>
**> >> Cheers,
**> >>
**> >> Mark
**> >>
**> >> ______________________________________________
**> >> R-help_at_stat.math.ethz.ch mailing list
**> >> https://stat.ethz.ch/mailman/listinfo/r-help
**> >> PLEASE do read the posting guide http://www.R-project.org/posting-
**> >> guide.html and provide commented, minimal, self-contained,
**> >> reproducible code.
**> >
**> > --
**> > Robin Hankin
**> > Uncertainty Analyst
**> > National Oceanography Centre, Southampton European Way, Southampton
**> > SO14 3ZH, UK
**> > tel 023-8059-7743
**> >
**> > ______________________________________________
**> > R-help_at_stat.math.ethz.ch mailing list
**> > https://stat.ethz.ch/mailman/listinfo/r-help
**> > PLEASE do read the posting guide http://www.R-project.org/posting-
**> > guide.html and provide commented, minimal, self-contained,
**> > reproducible code.
**>
**> --
**> Robin Hankin
**> Uncertainty Analyst
**> National Oceanography Centre, Southampton European Way,
**> Southampton SO14 3ZH, UK
**> tel 023-8059-7743
**>
**>
**>
*

>

R-help_at_stat.math.ethz.ch mailing list

https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Mon 30 Apr 2007 - 16:09:44 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Mon 30 Apr 2007 - 17:31:05 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*