
Ah... e, nao tao eficaz como minha sugestao inicial (ha' mudancas dentro de f e g que podem tornar o codigo mais rapido), mas apenas para registro, vc pode usar modelos lineares para isso: f = function(m){ y <- as.numeric(m) f1 <- factor(col(m)) f2 <- factor(row(m)) matrix(residuals(lm(y~f1+f2)), nc=3) } g <- function(m){ y <- as.numeric(m) X <- model.matrix(~factor(col(m))+factor(row(m))) b <- solve(crossprod(X), crossprod(X, y)) matrix(y-X%*%b, nc=3) } ref <- function(m){ mg = mean(m) mr = rowMeans(m) mc = colMeans(m) sweep(sweep(m, 1, mr), 2, mc)+mg } set.seed(1) m <- matrix(runif(24), ncol=3) system.time(r0 <- f(m)) system.time(r1 <- g(m)) system.time(refRes <- ref(m)) all.equal(r0, r1) all.equal(r0, refRes) b 2012/4/14 Benilton Carvalho <beniltoncarvalho@gmail.com>:
sweep(sweep(m, 1, mr), 2, mc)+mg