【问题标题】:Replacing for loop across a list of same-dimensional matrices for more efficiency在相同维度的矩阵列表中替换 for 循环以提高效率
【发布时间】:2021-10-28 23:48:27
【问题描述】:

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

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

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

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

所以问题是:有没有办法替换 for 循环,例如通过申请? 我已经尝试了几个小时并搜索了论坛,但似乎无法找到针对这种特定情况的解决方案。 感谢您的帮助!

最小的工作示例:

# 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]}

【问题讨论】:

    标签: r for-loop matrix apply markov


    【解决方案1】:

    您也可以在Map 中使用[&lt;-

    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
    

    【讨论】:

    • 太棒了。非常感谢!
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2019-11-06
    • 2014-10-10
    • 2021-03-29
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多