Ответ 1
Я не думаю, что вы можете избежать первого матричного умножения (т.е. ZX
), но вы можете сделать второй, который является дорогим:
rowSums((Z %*% X) * Z)
# [1] 70 160 290
Второе умножение НЕ умножает матрицу. Это намного быстрее:
library(microbenchmark)
set.seed(1)
X <- matrix(c(10,-5,-5,20), ncol = 2)
Z <- matrix(sample(1:1000), ncol=2) # made Z a little bigger
microbenchmark(
res.new <- rowSums((Z %*% X) * Z), # this solution
res.old <- diag(Z %*% X %*% t(Z)) # original method
)
# Unit: microseconds
# expr min lq mean median uq max neval
# res.new <- rowSums((Z %*% X) * Z) 20.956 23.233 34.77693 29.6150 44.0025 67.852 100
# res.old <- diag(Z %*% X %*% t(Z)) 571.214 699.247 1761.08885 760.4295 1188.4485 47488.543 100
all.equal(res.new, res.old)
# [1] TRUE