【问题标题】:Loop through every ith row of a matrix j times more efficiently in R在 R 中更有效地循环遍历矩阵的每一行 j 次
【发布时间】:2016-08-14 22:09:21
【问题描述】:

我正在运行我拥有的一段旧 R 代码,并将其作为一个学习练习更有效地运行。

我有一个矩阵,它有 366 行,代表一年中的每一天 (probMatrix)。 我有另一个有 7 行,代表一周中的每一天(从星期一开始)。这两个矩阵都有 10 列。

第二个矩阵包含一周中每一天的布尔值,我想在相关元素处乘以第一个矩阵(按行)。

最后,因为星期一直到 2016 年的第四天才出现,所以第二个矩阵需要偏移四,以便乘以正确的天数。

我最初有一个 for 循环,它每天迭代并使用包含对应于一周第一天的第一个矩阵的相关索引的向量扫描概率矩阵:

probMatrix <- matrix(rep((rep(1,366)), 10), ncol=10,byrow=TRUE)
booleanMatrix <- matrix(rep(c(0,0,0,0,1), 14), ncol=10, byrow=FALSE)

for (day in 1:7){
    actualDay <- (day+3)
    dayIndex <- c(seq(actualDay,366,7))
    probMatrix[dayIndex,] <- sweep(probMatrix[dayIndex,],2,
    as.numeric(booleanMatrix[day,]),"*")
}

但是,正如我上面提到的,这是一种非常低效的方法。我想要一些运行速度更快的东西,因为这种代码在脚本中运行很多。

【问题讨论】:

标签: r performance loops matrix


【解决方案1】:

如果您将行名设置为

rownames(booleanMatrix) <- 1:7
rownames(probMatrix) <- c(rep(c(5,6,7,1,2,3,4), 52), 5, 6)

那你就可以了

probMatrix <- probMatrix * booleanMatrix[rownames(probMatrix), ]

应该更快。或者将索引保存在变量中并将该变量用作索引。

【讨论】:

  • 谢谢。这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多