我想要将同样大小的多个矩阵与一个初始向量相乘。在下面的例子中,p.state
是一个包含 m
个元素的向量,tran.mat
是一个列表,其中每个成员都是一个 m x m
的矩阵。
for (i in 1:length(tran.mat)){
p.state <- p.state %*% tran.mat[[i]]
}
以上代码给出了正确答案,但在length(tran.mat)
较大时可能会很慢。我想知道是否有更高效的方法来实现这个问题?
以下是一个示例,其中m=3
和length(mat)=10
可以生成此结果:
p.state <- c(1,0,0)
tran.mat<-lapply(1:10,function(y){apply(matrix(runif(9),3,3),1,function(x){x/sum(x)})})
for (i in 1:length(tran.mat)){
p.state <- p.state %*% tran.mat[[i]]
}
print(p.state)
注意:
tran.mat
不一定是一个列表,它只是目前被写成一个列表。在一些评论之后进行编辑:
当
m
很小的时候,可以使用 Reduce
。然而,当 m=6
时,循环表现优于上述两种解决方案。请注意,保留了 html 标签。p.state1 <- p.state <- c(1,0,0,0,0,0)
tran.mat<-lapply(1:10000,function(y){t(apply(matrix(runif(36),6,6),1,function(x){x/sum(x)}))})
tst<-do.call(c, list(list(p.state), tran.mat))
benchmark(
'loop' = {
for (i in 1:length(tran.mat)){
p.state <- p.state %*% tran.mat[[i]]
}
},
'reduce' = {
p.state1 %*% Reduce('%*%', tran.mat)
},
'reorder' = {
Reduce(`%*%`,tran.mat,p.state1)
}
这将导致
test replications elapsed relative user.self sys.self user.child sys.child
1 loop 100 0.87 1.000 0.87 0 NA NA
2 reduce 100 1.41 1.621 1.39 0 NA NA
3 reorder 100 1.00 1.149 1.00 0 NA NA
'%*%'
,而要写\
%%`)。R 允许字符串引用函数名称的事实是一种破坏类型系统的可恶行为。除此之外,为什么不使用
Reduce(`%%`, tran.mat, p.state)` 呢? - Konrad Rudolphm
较大时无法正常工作。请参见原问题中的编辑。 - wearetheboro1 x m
的矩阵乘以一个m x m
的矩阵length(tran.mat)
次,而使用Reduce
函数时,我们将m x m
的矩阵乘以length(tran.mat)
次。前者的操作要少得多。 - wearetheboro