I have lists of matrices stored in various ways. I'd like to extend %*% to work on these. Is this possible, or should I create my own new operator? A simplified example would be as follows: A <- list( A1, A2, A3) B <- list( B1, B2, B3) where A1,...,B3 are all matrices, and I'd like A %*% B to return list( A1 %*% B1, A2 %*% B2, A3 %*% B3) In the real case A and B are sometimes arrays, sometimes something else; lists haven't come up so far, but the principle should be the same. Duncan Murdoch
Duncan Murdoch wrote:> I have lists of matrices stored in various ways. I'd like to extend > %*% to work on these. Is this possible, or should I create my own new > operator? > > A simplified example would be as follows: > > A <- list( A1, A2, A3) > B <- list( B1, B2, B3) > > where A1,...,B3 are all matrices, and I'd like A %*% B to return > > list( A1 %*% B1, A2 %*% B2, A3 %*% B3) > > In the real case A and B are sometimes arrays, sometimes something > else; lists haven't come up so far, but the principle should be the > same. > > Duncan MurdochThe straightforward way without extending %*% (I feel that extending it is dangerous, in a way) is mapply("%*%", A, B, SIMPLIFY = FALSE) Uwe Ligges
On Mon, 19 May 2003 21:56:24 -0400, you wrote in message <te2jcvkqn8uq9it881386oqi1n4j8ncakh@4ax.com>:>I have lists of matrices stored in various ways. I'd like to extend >%*% to work on these. Is this possible, or should I create my own new >operator?In answer to my own question: yes, it's possible, using the S4 classes and methods. It would look something like this: setClass("special", representation(m = "list")) setMethod("%*%", signature(x = "special", y="special"), function(x,y) new("special", m = mapply("%*%", x@m, y@m, SIMPLIFY=FALSE)) ) A1 <- A2 <- A3 <- B1 <- B2 <- B3 <- diag(c(2,3)) A <- new("special", m = list(A1, A2, A3)) B <- new("special", m = list(A1, A2, A3)) A %*% B (Thanks Uwe for the compact expression to implement the method!) Duncan Murdoch