Nếu bạn có một số lượng lớn các cột t của bạn (t (m) * v) giải pháp nhanh hơn so với các giải pháp nhân ma trận bởi một rộng lề. Tuy nhiên, có một giải pháp nhanh hơn, nhưng nó đi kèm với chi phí cao trong việc sử dụng bộ nhớ. Bạn tạo một ma trận lớn như m bằng cách sử dụng rep() và nhân yếu tố. Dưới đây là ví dụ về so sánh, sửa đổi của 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
Như bạn có thể thấy, sử dụng "mỗi" trong rep() hy sinh tốc độ cho sự rõ ràng. Sự khác biệt giữa rep.int và đại diện dường như không thể bỏ qua, cả hai triển khai hoán đổi vị trí trên các lần chạy lặp lại của microbenchmark(). Hãy nhớ rằng, ncol (m) == chiều dài (v).
liên quan: http://stackoverflow.com/q/3643555/946850 – krlmlr