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

标签 r for-loop matrix apply markov

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

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

因此我所做的是使用 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/

相关文章:

r - 如何使用 R 中的 dplyr 根据跨多列的条件过滤数据框

python - 修复 python/Bioinformatics 中的代码

matlab - 从移位向量制作矩阵 matlab 向量化

r - R 中面板数据的子集化

string - R:如何根据规范更改数据框中的列名

javascript - 如何在大括号内的代码块周围使用 for 循环?

r - 使用 R 合并矩阵和向量

c - 我如何使用 malloc 在 C 中创建矩阵并避免内存问题?如何使用 C99 语法将矩阵传递给函数?

r - 根据行中存在的观察结果突变新列

java - 以 Java8 声明式方式填充 Arraylist,而不是迭代地执行