Se si dispone di un maggior numero di colonne vostra t (t (m) * v) supera la soluzione di matrice moltiplicazione per una vasta margine. Tuttavia, esiste una soluzione più veloce, ma ha un costo elevato nell'utilizzo della memoria. Crei una matrice grande quanto m usando rep() e moltiplica elementwise. Ecco il confronto, modificando l'esempio di mnel:
m = matrix(rnorm(1200000), ncol=600)
v = rep(c(1.5, 3.5, 4.5, 5.5, 6.5, 7.5), length = ncol(m))
library(microbenchmark)
microbenchmark(t(t(m) * v),
m %*% diag(v),
m * rep(v, rep.int(nrow(m),length(v))),
m * rep(v, rep(nrow(m),length(v))),
m * rep(v, each = nrow(m)))
# Unit: milliseconds
# expr min lq mean median uq max neval
# t(t(m) * v) 17.682257 18.807218 20.574513 19.239350 19.818331 62.63947 100
# m %*% diag(v) 415.573110 417.835574 421.226179 419.061019 420.601778 465.43276 100
# m * rep(v, rep.int(nrow(m), ncol(m))) 2.597411 2.794915 5.947318 3.276216 3.873842 48.95579 100
# m * rep(v, rep(nrow(m), ncol(m))) 2.601701 2.785839 3.707153 2.918994 3.855361 47.48697 100
# m * rep(v, each = nrow(m)) 21.766636 21.901935 23.791504 22.351227 23.049006 66.68491 100
Come si può vedere, l'utilizzo di "ogni" in rep() sacrifici velocità per chiarezza. La differenza tra rep.int e rep sembra essere trascurabile, entrambe le implementazioni scambiano i posti su ripetute serie di microbenchmark(). Tieni presente che ncol (m) == lunghezza (v).
correlati: http://stackoverflow.com/q/3643555/946850 – krlmlr