如何使用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"