【发布时间】:2019-04-16 13:50:51
【问题描述】:
我想将几个相同大小的矩阵与一个初始向量相乘。在下面的示例中,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 不必是一个列表,它只是当前写成一个。
在几个 cmets 后编辑:
Reduce 在m 很小的时候很有用。但是,当m=6 循环执行上述两种解决方案时。
库(rbenchmark)
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 loops matrix multiplication markov-chains