我有' mylist" - 相同大小的矩阵列表:
mylist <- vector("list", 5)
set.seed(123)
for(i in 1:5){
mylist[[i]] <- matrix(rnorm(9), nrow = 3)
}
我还有一个权重矢量&#39; mywgts&#39; - 与&#39; mylist相同的长度&#39;
mywgts <- c(0.8, 0.9, 1, 1.1, 1.2)
我需要计算这些矩阵的加权平均值 - 逐个元素。 结果将是3乘3矩阵,其中第一个元素是:
mylist[[1]][1,1]*mywgts[1] + mylist[[2]][1,1]*mywgts[2] +
mylist[[3]][1,1]*mywgts[3] + mylist[[4]][1,1]*mywgts[4] +
mylist[[5]][1,1]*mywgts[5]
我知道如何通过循环遍历矩阵的所有元素来实现它。但我正在寻找一种更简约/优雅的R型解决方案。 此外 - &#39; mylist的实际长度&#39;事先不知道。
感谢您的任何提示!
答案 0 :(得分:3)
您可以尝试
res <- Reduce(`+`,Map(`*`, mylist, mywgts))
res
# [,1] [,2] [,3]
#[1,] 0.6852912 0.2116715 0.7993867
#[2,] -0.8815045 -1.9811868 1.2558095
#[3,] 1.5150166 0.8780412 0.7254080
Map
是mapply
的包装器,是sapply
的多变量版本。函数(*
)应用于第一个('mylist')和第二个元素('mywgts')的相应元素,然后使用Reduce
对list
的相应元素求和}。
如果您需要mean
,请除以'mylist`的长度。
res/length(mylist)
使用OP的计算
mylist[[1]][1,1]*mywgts[1] + mylist[[2]][1,1]*mywgts[2] +
mylist[[3]][1,1]*mywgts[3] + mylist[[4]][1,1]*mywgts[4] +
mylist[[5]][1,1]*mywgts[5]
#[1] 0.6852912
mylist[[1]][1,2]*mywgts[1] + mylist[[2]][1,2]*mywgts[2] +
mylist[[3]][1,2]*mywgts[3] + mylist[[4]][1,2]*mywgts[4] +
mylist[[5]][1,2]*mywgts[5]
#[1] 0.2116715