如何快速将矩阵列表乘以向量列表?
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 哪个最大。最小的总是更好。
我有一个 (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 哪个最大。最小的总是更好。