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

时间:2015-03-15 03:04:05

标签: r list matrix vector

我有一个(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矩阵等。

我应该使用列表执行此操作还是不必要?我希望它尽可能快。

我想返回一个13 x 122矩阵。

3 个答案:

答案 0 :(得分:2)

我们可以将split矩阵放入'列表'长度 122'并使用mapply来完成%*%相应的“{1}}元素”以及' 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

答案 1 :(得分:1)

试试这个:

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,])

答案 2 :(得分:0)

查找算法的书籍介绍,请参阅第331页。有一个pseodu算法可以做到这一点。你必须制作一个矩阵产品中的三个,它将对它进行排序,以便它是乘法的最佳选择,但如果你有mxn的三个矩阵M1,nxv的M2,vxw的M3,那么你想知道是否( M1 * M2)* M3或M1 *(M2 * M3)更好的答案是计算数字m n v和n v w和deside最大。最小的一个总是更好。