如何使用Reduce以相反顺序乘以多个矩阵?

如何使用Reduce以相反顺序乘以多个矩阵?,r,R,假设我有一个矩阵列表,W,我想同时执行W[[1]]%*%W[[2]]%*%W[[3]]%*%W[[4]]%*%…和W[[4]]%*%W[[3]]%*%W[[2]]%*%W[[1]%*%…。似乎Reduce(`%*%`,W)和Reduce(`%*%`,W,right=T)应该这样做,但这似乎不起作用。下面的代码给出了一个示例: set.seed(90088) W <- list( matrix(sample(1:5, size = 25, replace = T), ncol = 5

假设我有一个矩阵列表,
W
,我想同时执行
W[[1]]%*%W[[2]]%*%W[[3]]%*%W[[4]]%*%…
W[[4]]%*%W[[3]]%*%W[[2]]%*%W[[1]%*%…
。似乎
Reduce(`%*%`,W)
Reduce(`%*%`,W,right=T)
应该这样做,但这似乎不起作用。下面的代码给出了一个示例:

set.seed(90088)
W <- list(
    matrix(sample(1:5, size = 25, replace = T), ncol = 5),
    matrix(sample(1:5, size = 25, replace = T), ncol = 5),
    matrix(sample(1:5, size = 25, replace = T), ncol = 5),
    matrix(sample(1:5, size = 25, replace = T), ncol = 5)
    )
Reduce(`%*%`, W)
Reduce(`%*%`, W, right = T)
W[[1]] %*% W[[2]] %*% W[[3]] %*% W[[4]]
W[[4]] %*% W[[3]] %*% W[[2]] %*% W[[1]]
set.seed(90088)

W要颠倒元素的相乘顺序,只需颠倒您输入到
Reduce()
的列表中元素的顺序即可

要查看
right=TRUE
的作用(这有点有趣),请检查对
Reduce()的简单调用的中间结果:


Reduce(
%*%%
,rev(W))
Huh。这不是我所期望的,但这很有趣。谢谢接下来,看起来是
right
选项决定了将添加到
init
的哪一侧。例如,
Y@JakeFisher——很好。我刚刚添加了另一个使用非交换函数的示例,它更好地说明了(也是非交换的)矩阵乘法失败的原因。
Reduce(`%*%`, rev(W))
#       [,1]  [,2]  [,3] [,4]  [,5]
# [1,] 11583  8978  9082 5034 10443
# [2,] 12759  9950  9967 5604 11565
# [3,]  7269  5686  5702 3176  6575
# [4,] 15459 12094 12050 6857 14060
# [5,]  9834  7684  7691 4314  8916
Reduce(`*`, 5:1, accumulate=TRUE, right=FALSE)
# [1]   5  20  60 120 120
Reduce(`*`, 5:1, accumulate=TRUE, right=TRUE)
# [1] 120  24   6   2   1

## And a non-commutative function shows even more clearly how right=TRUE works:
Reduce(paste0, letters[1:5], right=TRUE, accumulate=TRUE)
# [1] "abcde" "bcde"  "cde"   "de"    "e"