如何快速将矩阵列表乘以向量列表?

How to quickly multiply a list of matrices by a list of vectors?

我有一个 (13*122) x (14) 矩阵(122 个堆叠的 13x14's),我将其制成一个包含 122 个单独 13 x 14 矩阵的列表。

set.seed(1)

mat = matrix(rnorm(13*122*14,0,1),(13*122),14)

我有另一个矩阵 122 x 14

beta = matrix(rnorm(122*14,0,1),122,14)

我想将每个堆叠矩阵乘以 beta 中的相应行,因此第一个 13 x 14 矩阵将乘以 beta[1,](即 14x1),所以我' d得到13x1矩阵等

我应该用列表来做还是没有必要?我希望它尽可能快。

我想要return一个13 x 122矩阵。

我们可以split将矩阵变成长度为'122'的'list'并使用mapply对'lst'的对应元素进行%*%和 'beta'

lst <- lapply(split(1:nrow(mat),(1:nrow(mat)-1) %/%13+1),
                        function(i) mat[i,])
res <- mapply(`%*%`, lst, split(beta, row(beta)))
dim(res)
#[1]  13 122

或者我们可以将 matrix 转换为 array,然后进行乘法运算,我想这样会很快

mat1 <- mat #if we need a copy of the original matrix 
dim(mat1) <- c(13, 122, 14)
mat2 <- aperm(mat1, c(1,3,2))
res2 <- matrix(, ncol=122, nrow=13)
for(i in 1:(dim(mat2)[3])){
  res2[,i] <- mat2[,,i] %*%beta[i,]
}

all.equal(res, res2, check.attributes=FALSE)
#[1] TRUE

试试这个:

mat <- lapply(1:122, function(x) matrix(data = rnorm(13*14,0,1), nrow = 13, ncol = 14))

mat2 <- lapply(1:122, function(x) mat[[x]] %*% beta[x,])

查找算法介绍书并查看第 331 页。有一个伪算法可以这样做。你必须制作三个矩阵乘积,它会对它进行排序,以便它是乘法的最佳选择,但简而言之,如果你有三个 m x n 的矩阵 M1,n x v 的 M2,v x w 的 M3,那么你想知道是否( M1 * M2) * M3 或 M1 * (M2 * M3) 更好答案是计算数字 mnv 和 nv w 和 deside 哪个最大。最小的总是更好。