gpt4 book ai didi

替换同维矩阵列表中的 for 循环以提高效率

转载 作者:行者123 更新时间:2023-12-04 17:14:17 25 4
gpt4 key购买 nike

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

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

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

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

所以问题是:有没有办法替换 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]}

最佳答案

或者您可以使用 [<-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

关于替换同维矩阵列表中的 for 循环以提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68980490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com