array addition
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}}