快速将列表中矩阵的所有组合相乘

时间:2019-02-19 12:18:08

标签: r list matrix-multiplication reduce

我有一个对称矩阵Siginv和一个列表Z,其中包含大小为N的{​​{1}}个矩阵。

我有三种方法来计算我需要的东西(见下文)。第一个从字面上看采用公式,并且比预期的慢。有做我做事的更快方法吗?

TxK

目前,这些方法比较如下:

library(microbenchmark)

K <- 2
N <- 50
Siginv <- matrix(rnorm(N^2), ncol=N)
Siginv[lower.tri(Siginv)] <- t(Siginv)[lower.tri(Siginv)] # just some symmetric matrix

Tdim <- 400
Z <- replicate(N, matrix(rnorm(Tdim*K), ncol=K), simplify = F)

microbenchmark({
  I <- diag(Tdim)
  Z.m <- do.call(rbind, Z)
  meat.mat.GLS.kp <- t(Z.m)%*%(Siginv%x%I)%*%Z.m
}, {
  combs <- expand.grid(1:N, 1:N)
  cprods.GLS <- mapply(function(i,j) Siginv[j,i]*t(Z[[i]])%*%Z[[j]], combs[,1], combs[,2], SIMPLIFY = F)
  meat.mat.GLS <- Reduce("+", cprods.GLS)
}, {
  combs <- expand.grid(1:N, 1:N)
  cprods.GLS2 <- mapply(function(i,j) Siginv[j,i]*crossprod(Z[[i]],Z[[j]]), combs[,1], combs[,2], SIMPLIFY = F)
  meat.mat.GLS2 <- Reduce("+", cprods.GLS2)
}, times=5)

all.equal(meat.mat.GLS.kp, meat.mat.GLS, meat.mat.GLS2) # TRUE

0 个答案:

没有答案