Hi
suppose I have two arrays x1,x2 of dimensions a1,b1,c1 and
a2,b2,c2 respectively.
I want x = x1 "+" x2 with dimensions c(max(a1,a2), max(b1,b2),max
(c1,c2))
with
x[a,b,c] = x1[a1,b1,c1] + x2[a2,b2,c2] if a <=min(a1,a2) , b<=min
(b1,b2), c<=min(c1,c2)
and the other bits either x1 or x2 or zero according to whether the
coordinates
are "in range" for x1 or x2 or neither.
The answer has to work for arbitrary-dimensioned arrays.
toy example follows (matrices):
> x1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> x2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 2 7 12 7 9
[2,] 4 9 14 8 10
[3,] 3 6 9 0 0
>
Note the zeros at lower-right.
Is there a ready-made solution to this?
--
Robin Hankin
Uncertainty Analyst and Neutral Theorist,
National Oceanography Centre, Southampton
European Way, Southampton SO14 3ZH, UK
tel 023-8059-7743
Un texte encapsul? et encod? dans un jeu de caract?res inconnu a ?t? nettoy?... Nom : non disponible Url : https://stat.ethz.ch/pipermail/r-help/attachments/20071219/a02f77af/attachment.pl
Try this:
"%add%" <- function(x1, x2)
{
dim1 <- dim(x1)
dim2 <- dim(x2)
seq1 <- list();for(i in 1:length(dim1)) seq1[[i]]=seq(dim1[i])
filter1 <- paste(seq1, collapse=",")
cmd1 <- paste("out[", filter1, "]", sep="")
seq2 <- list();for(i in 1:length(dim2)) seq2[[i]]=seq(dim2[i])
filter2 <- paste(seq2, collapse=",")
cmd2 <- paste("out[", filter2, "]", sep="")
out <- array(0, dim=pmax(dim1,dim2))
eval(parse(text=paste(cmd1, "<-", cmd1, "+ x1")))
eval(parse(text=paste(cmd2, "<-", cmd2, "+ x2")))
out
}
x1 <- array(round(5*runif(30)), dim=c(2,3,5))
x2 <- array(round(5*runif(24)), dim=c(3,4,2))
x <- x1 %add% x2
You probably want to add a check to make the dimensions the same, and the
code needs tidying, but you get the idea.
Regards,
Richie.
Mathematical Sciences Unit
HSL
r-help-bounces at r-project.org wrote on 19/12/2007 09:26:44:
> Hi
>
> suppose I have two arrays x1,x2 of dimensions a1,b1,c1 and
> a2,b2,c2 respectively.
>
> I want x = x1 "+" x2 with dimensions c(max(a1,a2),
max(b1,b2),max
> (c1,c2))
>
> with
>
> x[a,b,c] = x1[a1,b1,c1] + x2[a2,b2,c2] if a <=min(a1,a2) , b<=min
> (b1,b2), c<=min(c1,c2)
>
> and the other bits either x1 or x2 or zero according to whether the
> coordinates
> are "in range" for x1 or x2 or neither.
>
> The answer has to work for arbitrary-dimensioned arrays.
>
> toy example follows (matrices):
>
>
> > x1
> [,1] [,2] [,3] [,4] [,5]
> [1,] 1 3 5 7 9
> [2,] 2 4 6 8 10
> > x2
> [,1] [,2] [,3]
> [1,] 1 4 7
> [2,] 2 5 8
> [3,] 3 6 9
> > x
> [,1] [,2] [,3] [,4] [,5]
> [1,] 2 7 12 7 9
> [2,] 4 9 14 8 10
> [3,] 3 6 9 0 0
> >
>
>
> Note the zeros at lower-right.
>
>
> Is there a ready-made solution to this?
>
>
>
>
>
> --
> Robin Hankin
> Uncertainty Analyst and Neutral Theorist,
> National Oceanography Centre, Southampton
> European Way, Southampton SO14 3ZH, UK
> tel 023-8059-7743
>
> ______________________________________________
> R-help at r-project.org 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.
------------------------------------------------------------------------
ATTENTION:
This message contains privileged and confidential inform...{{dropped:20}}
[snip snip snip]> suppose I have two arrays x1,x2 of dimensions a1,b1,c1 and > a2,b2,c2 respectively. > > I want x = x1 "+" x2 with dimensions c(max(a1,a2), max(b1,b2),max > (c1,c2))[snip snip snip] perhaps it wouldn't be too much to ask for you to check the most recent version of the "magic" package? [and we *really* don't want any whingeing about magic_1.3-31 not being available. If I were you, I'd email the package maintainer and tell him to release updates in a more timely manner. . . ] > library(magic) > aplus function (...) { args <- list(...) if (length(args) == 1) { return(args[[1]]) } if (length(args) > 2) { jj <- do.call("Recall", c(args[-1])) return(do.call("Recall", c(list(args[[1]]), list(jj)))) } a <- args[[1]] b <- args[[2]] dima <- dim(a) dimb <- dim(b) stopifnot(length(dima) == length(dimb)) out <- array(0, pmax(dima, dimb)) return(do.call("[<-", c(list(out), lapply(dima, seq_len), list(a))) + do.call("[<-", c(list(out), lapply(dimb, seq_len), list(b)))) } > -- Robin Hankin Uncertainty Analyst and Neutral Theorist, National Oceanography Centre, Southampton European Way, Southampton SO14 3ZH, UK tel 023-8059-7743