如何在三个或更多矩阵上使用 crossprod?

How can I use crossprod on three or more matrices?

受到这个问题 的启发,我想知道我是否可以在三个或更多矩阵上使用 crossprod。我正在尝试计算一个通用列表,其中包含多个矩阵列表与 Map(crossprod,listA,listB) 的叉积。我试过 Map(crossprod,listA,listB,listC) 但只得到了 listA 和 listB 的元素矩阵的叉积。列表 A、B、C 具有相同数量的矩阵。所有矩阵都具有相同的维度。我目前的修复是

result1<-Map(crossprod,listA,listB)
Map(crossprod,result1,listC)  

如何做一行代码?非常感谢!

一个选项是accumulate

library(purrr)
out2 <- flatten(tail(accumulate(lst1, map2, crossprod), 1))

-检查 OP 的输出

out1 <- Map(crossprod,result1,listC) 
identical(out1, out2)
#[1] TRUE

或使用base R

do.call(c, tail(Reduce(function(...) Map(crossprod, ...), 
         lst1, accumulate = TRUE), 1))

数据

m1 <- matrix(1:9, 3, 3)
m2 <- matrix(11:19, 3, 3)
listA <- list(m1, m2)
listB <- listA
listC <- listA
lst1 <- mget(paste0("list", c("A", "B", "C")))
library(purrr)

a = matrix(runif(9),ncol=3)
b = matrix(runif(9),ncol=3)
c = matrix(runif(9),ncol=3)

ListA = list(a,b)
ListB = list(a,c)
ListC = list(b,c)

# list with the lists of matrix
L = list(ListA,ListB,ListC)
Reduce("%*%",map(L,~Reduce("%*%",.)))

#Validation
a %*% b %*% a %*% c %*% b%*% c