多个矩阵的加权平均值 - 逐元素计算

4
我有一个'mylist',它是一个由相同大小的矩阵组成的列表:
mylist <- vector("list", 5) 
set.seed(123)
for(i in 1:5){
  mylist[[i]] <- matrix(rnorm(9), nrow = 3)
}

我还有一个权重向量'mywgts' - 与'mylist'长度相同

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的解决方案。 另外,'mylist'的实际长度事先是不知道的。

非常感谢任何提示!

1个回答

5

您可以尝试

 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

Mapmapply的包装器,后者是sapply的多元版本。该函数(*)应用于第一个('mylist')和第二个元素('mywgts')的对应元素,然后使用Reduce来总结list的对应元素。

如果您需要mean,请将其除以'mylist'的长度。

  res/length(mylist)

使用原帖作者的计算

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

哇,非常感谢 - 这正是我正在寻找的解决方案类型! - user2323534

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接