我正在研究一个问题,其中一个矩阵必须迭代计算大量次.必要的矩阵乘法采用以下形式
t(X) %*% ( ( X %*% W %*% t(X) * mu0 ) * mu1 )
其中X
是N x P
,W
是symmetric P x P
矩阵.mu0
和mu1
是N x 1
个向量,计算和输入各自的乘积元素很便宜.
不幸的是,N
可能相当大,这导致了巨大的计算需求,因为X %*% W %*% t(X)
是N x N
.我想知道是否有任何策略或计算技巧,例如基于矩阵分解的策略或计算技巧,可以用来加快计算速度.在每次迭代中,mu0
和mu1
都会发生变化,但X
和W
是固定的,因此任何包括这些矩阵的预计算都会起作用.
BENCHMARKING
到目前为止,我能想到的最快的方法是进行一些明显的预计算:
# fake data
N = 2500
P = 10
X = matrix(rnorm(N*P), N, P)
W = matrix(rnorm(P*P), P, P)
mu0 = rnorm(N)
mu1 = rnorm(N)
# precomputations
tX = t(X)
XWX = X %*% W %*% t(X)
# functions
f_raw = function(X, W, mu0, mu1){t(X) %*% ( ( X %*% W %*% t(X) * mu0 ) * mu1 )}
f_precomp = function(XWX, tX, mu0, mu1){tX %*% ( ( XWX * mu0 ) * mu1 )}
# benchmark
microbenchmark::microbenchmark(f_raw(X, W, mu0, mu1),
f_precomp(XWX, tX, mu0, mu1))
Unit: milliseconds
expr min lq mean median uq max neval
f_raw(X, W, mu0, mu1) 283.5918 286.5080 299.4621 289.5151 302.9726 355.4271 100
f_precomp(XWX, tX, mu0, mu1) 167.4169 168.7336 180.6468 171.0852 197.7475 263.8090 100