r语言 - 替换相同维矩阵列表中的for循环以提高效率



我有一个相同维数的矩阵列表。在所有矩阵中,大多数值为零。

非零的值根据矩阵在列表中的位置而变化,用于替换的值存储在与矩阵列表长度相同的向量中。

因此,我所做的是使用for循环替换非零值。然而,作为相对较新的R,我已经明白,这可能不是最有效的方式来做到这一点,特别是因为我有很多矩阵和相当多的非零概率(所有这些实际上都在一些函数内)。

Background是一个自制的马尔可夫模型,现在我想完全控制正在发生的事情(即不使用任何包),矩阵实际上是年龄和状态相关的转换矩阵。

那么问题来了:有没有一种方法可以代替for循环,比如apply?我已经尝试了几个小时,搜索论坛,但似乎不能找到一个解决方案,这种具体情况。谢谢你的帮助!

最小工作示例:

# some large matrix
m0 <- list(as.matrix(cbind(matrix(rep(0,3600), nrow=60))))
# replicate to get a list of 10 matrices of identical dimension
m <- rep(m0, 10)
# some fake data for replacement
set.seed(123)
p1 <- abs(rnorm(length(m), 0.1, 0.4))
p2 <- abs(rnorm(length(m), 0.2, 0.3))
p3 <- abs(rnorm(length(m), 0.3, 0.2))
p4 <- abs(rnorm(length(m), 0.4, 0.1))
# some replacements as example
# works with for loops, but is there a more efficient way to replace, e.g., by apply fcts?
for (i in 1:length(m)) {m[[i]][1,1] <- p1[i]}
for (i in 1:length(m)) {m[[i]][2,4] <- p2[i]}
for (i in 1:length(m)) {m[[i]][20,55] <- p3[i]}
for (i in 1:length(m)) {m[[i]][21,55] <- p4[i]}

您也可以在Map中使用[<-:

m2 <- rep(m0, 10)
m2 <- Map(`[<-`, m2, list(cbind(1, 1)), p1)
m2 <- Map(`[<-`, m2, list(cbind(2, 4)), p2)
m2 <- Map(`[<-`, m2, list(cbind(20, 55)), p3)
m2 <- Map(`[<-`, m2, list(cbind(21, 55)), p4)
identical(m, m2)
#[1] TRUE

或在一个循环:

m3 <- rep(m0, 10)
m3 <- Map(`[<-`, m3, list(cbind(c(1, 2, 20, 21), c(1, 4, 55, 55))),
asplit(cbind(p1, p2, p3, p4), 1))
identical(m, m3)
#[1] TRUE

最新更新