我有一个(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
矩阵。
答案 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最大。最小的一个总是更好。