在R中,对数组中的所有元素进行矩阵乘积运算?

4
如何在R中将数组中所有元素的矩阵乘积取出? 我已经在Stack Exchange上搜索过,但没有发现任何结果。
n <- 3
ARRAY <- array(NA, dim = c(4, 4, n))
for (i in 1:4) {
    for (j in 1:4) {
        ARRAY[i, j, ] <- rnorm(n)
    }
}

# this gives me a 1x1 matrix, which is wrong
Reduce("%*%", ARRAY)
mapply("%*%", ARRAY[,,1], ARRAY[,,2])

# this works, but I'd like a generalizable option
ARRAY[,,1]%*%ARRAY[,,2]%*%ARRAY[,,3]
1个回答

4
我们可以使用asplit按第三维度分割为一个列表,然后使用Reduce
out2 <-  Reduce(`%*%`, asplit(ARRAY, 3))

-测试

> out1 <- ARRAY[,,1]%*%ARRAY[,,2]%*%ARRAY[,,3]
> identical(out1, out2)
[1] TRUE

或者也可以循环遍历最后一个dim序列,提取列表中的元素。
out2 <- Reduce("%*%", lapply(seq(dim(ARRAY)[3]), function(i) ARRAY[,, i]))

或者也可以使用purrr中的array_branch函数。
library(purrr)
library(magrittr)
out3 <- array_branch(ARRAY, 3) %>%
    reduce(`%*%`)
> identical(out1, out3)
[1] TRUE

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